hdu5876 Sparse Graph(补图最短路)

Posted GraceSkyer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu5876 Sparse Graph(补图最短路)相关的知识,希望对你有一定的参考价值。

题目链接:hdu5876 Sparse Graph

一开始用vector一直TLE,然后就没有然后了。。

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<vector>
 6 #include<set>
 7 using namespace std;
 8 
 9 const int N = 200001;
10 const int M = 50001;
11 const int inf = 0x3f3f3f3f;
12 int n, m;
13 int d[N];
14 int head[N];
15 int cnt;
16 struct edge{
17     int nex;
18     int v, w;
19 }g[M];
20 void add_edge(int u,int v,int w){
21     g[cnt].v = v;
22     g[cnt].w = w;
23     g[cnt].nex = head[u];
24     head[u] = cnt++;
25 }
26 
27 void bfs(int s){
28     int u, v, i;
29     queue<int>q;
30     set<int>a; //不邻接的点
31     set<int>b; //未扩展的点
32     set<int>::iterator it;
33     for(i = 1; i <= n; ++i)
34         a.insert(i);
35     a.erase(s);
36     q.push(s);
37     while(!q.empty()){
38         u = q.front();
39         q.pop();
40         for(i = head[u]; ~i; i = g[i].nex){
41             v = g[i].v;
42             if(!a.count(v))
43                 continue;
44             b.insert(v);
45             a.erase(v);
46         }
47         for(it = a.begin(); it != a.end(); it++){
48             d[*it] = d[u] + 1;
49             q.push(*it);
50         }
51         a.swap(b);
52         b.clear();
53     }
54 }
55 int main(){
56     int t, i, j, x, y, s, f;
57     scanf("%d", &t);
58     while(t--){
59         scanf("%d %d", &n, &m);
60         memset(d, inf, sizeof(d));
61         memset(head, -1, sizeof(head));
62         cnt = 0;
63         for(i = 0; i < m; ++i){
64             scanf("%d %d", &x, &y);
65             add_edge(x, y, 1);
66             add_edge(y, x, 1);
67         }
68         scanf("%d", &s);
69         d[s] = 0;
70         bfs(s);
71         f = 0;
72         for(i = 1; i <= n; ++i){
73             if(i == s)continue;
74             if(d[i] == inf)
75                 printf("-1\n");
76             else if(!f){
77                 printf("%d", d[i]);
78                 f = 1;
79             }
80             else
81                 printf(" %d",d[i]);
82         }
83         printf("\n");
84     }
85     return 0;
86 }
View Code

 

以上是关于hdu5876 Sparse Graph(补图最短路)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5876 Sparse Graph(补图上BFS)

HDU - 5876 :Sparse Graph (完全图的补图的最短路 -BFS&set)

hdu 5876 (补图BFS) Sparse Graph

Sparse Graph---hdu5876(set+bfs)

HDU 5876 Sparse Graph

HDU 5876 Sparse Graph(补图中求最短路)