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("
");
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 }
原文地址:https://www.cnblogs.com/zyb993963526/p/7475903.html