博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Gym - 100812G 】Short Path (SPFA)
阅读量:5938 次
发布时间:2019-06-19

本文共 930 字,大约阅读时间需要 3 分钟。

题意

n个点m条无向有权边(2 ≤ n ≤ 10^5, 1 ≤ m ≤ 10^5),每个点标记了0或1,求所有1中,最近的两个1的下标及距离。

题解

先用SPFA求出每个点离标记1的点最近的距离,d[i]。

同时记录下每个点最近的1的下标。
两个最近的1,要么是被一条边连着,要么是被几个0隔着的边连着。
我们通过寻找它们中间的边来找出它们。
枚举每条边,如果相邻都是1,或者都是0且最近的1不是同一个,或者一个1,一个0,那么这条边两个端点的最近1的距离,就可以拿来更新答案。
需要long long。

代码

#include 
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f3f3f3f3f#define N 100005#define ll long longusing namespace std;typedef pair
PII;vector
edge[N<<1];int n,m,a[N];ll d[N];int near[N];bool b[N];queue
q;void SPFA(){ for(int i=1;i<=n;++i)if(!d[i]) { q.push(i); b[i]=true; near[i]=i; } while(!q.empty()){ int u=q.front(); q.pop(); b[u]=false; for(int j=0;j
w){ ans=w; ansa=i; ansb=to; } }else if(near[i]!=near[to]){ if(ans>d[i]+d[to]+w){ ans=d[i]+d[to]+w; ansa=near[i]; ansb=near[to]; } } } if(ans!=inf)printf("%lld\n%d %d",ans,ansa,ansb); else puts("No luck at all"); return 0;}

转载地址:http://esvtx.baihongyu.com/

你可能感兴趣的文章
有序的双链表
查看>>
程序员全国不同地区,微信(面试 招聘)群。
查看>>
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
闭包 !if(){}.call()
查看>>
python MySQLdb安装和使用
查看>>
Java小细节
查看>>
poj - 1860 Currency Exchange
查看>>
chgrp命令
查看>>
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>