HDU 5876 2016网预 大连
来源:互联网 发布:广电网络宽带 编辑:程序博客网 时间:2024/05/17 09:40
2016 ACM/ICPC Asia Regional Dalian Online
HDU 5876 Sparse Graph
补图最短路,BFS
传送门:HDU
题意
给你个稀疏图,再给你一源点,求在他的补图中,源点到各点的最短路。注意是无权图。
思路
无权图其实BFS是很快的。因为最先被BFS访问的点一定是访问的最短路。所以每个点BFS一次过后以后就不用管了。再加一个sum变量,访问过的点数。到n了,直接break就行了。
至于补图,也没想的那么复杂。用个set存,感觉set就是自动排序的vector,所以查什么的都是log。哪条边有,就存到set里面,BFS时如果set里面没有这个边,就说明补图里面有这条边,把点加入队列。
最后如果某个点的d值是无穷大,那么这个点就是不可到点,BFS也没访问过。输出-1就行了。
代码
注意sum变量,不加必T
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <stack>using namespace std;const int MAXN=200007;const int oo=0x3f3f3f3f;typedef long long LL;set<int> S[MAXN];int d[MAXN];void BFS(int n,int m,int s){ memset(d,0x3f,sizeof(d)); int sum=0; queue<int> Q; Q.push(s); d[s]=0; sum++; while(!Q.empty()) { int tx=Q.front();Q.pop(); for(int i=1;i<=n;i++) { if(d[i]!=oo) continue; if(!S[tx].count(i)) { Q.push(i); d[i]=d[tx]+1; sum++; } if(sum==n) break; } if(sum==n) break; } return;}int main(){ int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<=n;i++) S[i].clear(); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); if(!S[a].count(b)) S[a].insert(b); if(!S[b].count(a)) S[b].insert(a); } int s; scanf("%d",&s); BFS(n,m,s); int last; if(s==n) last=n-1; else last=n; for(int i=1;i<=n;i++) if(i!=s) if(d[i]==oo) printf("-1%c",i==last ? '\n' : ' '); else printf("%d%c",d[i],i==last ? '\n' : ' '); } return 0;}
0 0
- HDU 5876 2016网预 大连
- HDU 5874 2016网预 大连
- HDU 5875 2016网预 大连
- 2016 ICPC 大连网络赛 HDU 5876 Sparse Graph
- hdu 5876 - Sparse Graph(2016大连网络赛) bfs
- HDU 5876 大连网络赛 Sparse Graph
- HDU 5876 Sparse Graph 大连网络赛
- HDU 5979 && 2016ICPC大连 I: Convex
- 【2016-大连赛区网络赛-I】补图最短路(Sparse Graph,hdu 5876)
- 2016 大连网络赛 hdu 5876 ACM ICPC(补图求最短路)
- HDU 5980 icpc 大连
- 2016 大连网络赛 HDU 5874 Friends and Enemies【思维】
- 2016 ICPC 大连网络赛 HDU 5873 Football Games
- 2016 ICPC 大连网络赛 HDU 5874 Friends and Enemies
- 2016 ICPC 大连网络赛 HDU 5875 Function
- 2016 ICPC 大连网络赛 HDU 5877 Weak Pair
- HDU 5971 Wrestling Match 2016大连区域赛
- HDU 5974 A Simple Math Problem 2016大连区域赛
- 构造函数、析构函数抛出异常的问题
- 段错误原因分析和查找
- 利用MSSQL数据字典_查看相关数据
- 枚举驱动符号链接
- android中的ContentResolver获取手机本地图片
- HDU 5876 2016网预 大连
- 朋友,我用python给你发了一封邮件
- 如何创建一个新的ASP.NET项目
- Linux free -m命令 结果详解
- View的测量
- 归档存数据对比(NSUserDefaults)
- 推荐:经典SQL语句大全
- 14章预习
- Linux开发中常见段错误问题原因分析