HDU 5876 Sparse Graph(补图中求最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=5876
题意:
在补图中求s到其余各个点的最短路。
思路:
因为这道题目每条边的距离都是1,所以可以直接用bfs来做。
处理的方法是开两个集合,一个存储当前顶点可以到达的点,另一个存储当前顶点不能到达的点。如果可以到达,那肯定由该顶点到达是最短的,如果不能,那就留着下一次再判。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 #include<set> 11 using namespace std; 12 typedef long long ll; 13 typedef pair<int,int> pll; 14 const int INF = 0x3f3f3f3f; 15 const int maxn=200000+5; 16 17 int T; 18 int n, m, s; 19 int d[maxn]; 20 vector<int> G[maxn]; 21 22 void bfs() 23 { 24 queue<int> Q; 25 Q.push(s); 26 set<int> t1,t2; 27 set<int>::iterator it; 28 for(int i=1;i<=n;i++) if(i!=s) t1.insert(i); 29 while(!Q.empty()) 30 { 31 int u=Q.front(); Q.pop(); 32 for(int i=0;i<G[u].size();i++) 33 { 34 int v=G[u][i]; 35 if(!t1.count(v)) continue; 36 t1.erase(v); //删去u点不能到达的点 37 t2.insert(v); //将这些点放入t2中供下一次使用 38 } 39 for(it=t1.begin();it!=t1.end();it++) //这些点都是u能到达的 40 { 41 d[*it]=d[u]+1; 42 Q.push(*it); 43 } 44 t1.swap(t2); //t2中存储的是还没到达过的点 45 t2.clear(); 46 } 47 bool flag=true; 48 for(int i=1;i<=n;i++) 49 { 50 if(i==s) continue; 51 if(!flag) printf(" "); 52 if(flag) flag=false; 53 if(d[i]==-1) printf("-1"); 54 else printf("%d",d[i]); 55 } 56 printf("\n"); 57 } 58 59 int main() 60 { 61 //freopen("in.txt","r",stdin); 62 int T; 63 scanf("%d",&T); 64 while(T--) 65 { 66 scanf("%d%d",&n,&m); 67 for(int i=1;i<=n;i++) G[i].clear(); 68 while(m--) 69 { 70 int u,v; 71 scanf("%d%d",&u,&v); 72 G[u].push_back(v); 73 G[v].push_back(u); 74 } 75 scanf("%d",&s); 76 memset(d,-1,sizeof(d)); 77 d[s]=0; 78 bfs(); 79 } 80 return 0; 81 }