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 }

时间: 2025-01-14 02:05:34

hdu5876 Sparse Graph(补图最短路)的相关文章

HDU 5876 Sparse Graph BFS 最短路

Sparse Graph Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if and only if they are notadjacent in G. Now you are given an undirected graph G of N n

HDU 5876 Sparse Graph(补图上BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5876 题意: 有一个 n 个点无向图,再给你 m 对顶点, 代表着这 m 对顶点之间没有边, 除此之外每两个点之间都有一条边, 且权值为 1.然后还有一个源点 S, 让你计算源点到其他各点之间的最短距离,如果不存在则输出 -1.也就是说让你在所给的图的补图上求源点到其他各点的最短路径. 思路: 补图上求最短路径算是比较经典的题.在这里所求的最短路其实并不需要用到 dijkstra 之类的算法,由于每

hdu 5876 Sparse Graph 无权图bfs求最短路

Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if

hdu_5876_Sparse Graph(补图BFS)

题目链接:hdu_5876_Sparse Graph 附上叉姐的题解: 1009 Sparse Graph [by ftiasch] 题意:n 个点的无向完全图中删除 m 条边,问点 s 到其他点的最短路长度. 题解: 补图上的 BFS 是非常经典的问题.一般的做法是用链表(或者偷懒用 std::set)维护还没 BFS 过的点.当要扩展点 u 的时候,遍历一次还没访问过的点 v,如果 uv 没边,那么将 v 入队.否则将 v 留在未扩展点中. 很明显,后者只会发生 m 次,前者只会发生 n 次

HDU 5876 Sparse Graph

题目:Sparse Graph 链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5876 题意:给出一个图(V<=20万,E<=2万),要求先化为补图(每两个点,原本有边删去边,原本没边添加边),然后问指定点S到其他每个点的最短距离. 思路: 普通的广搜应该解决不了...O(n*m)太大,不会很难,比赛时没做出来有点可惜,当知道过了也进不了时,就安慰了许多. 变化一下思路,从起点出发,因为原本边<=2万,那么大部分的点都已经可以到达了

HDU 5876:Sparse Graph(BFS)

http://acm.hdu.edu.cn/showproblem.php?pid=5876 Sparse Graph Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if and only if they are not adjacent in G

2016大连网络赛 Sparse Graph

Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if

[HDOJ5876]Sparse Graph(补图最短路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5876 题意:求一个图的补图中的单源最短路. 题解说:补图上的 BFS 是非常经典的问题.一般的做法是用链表(或者偷懒用 std::set)维护还没 BFS 过的点.当要扩展点 u 的时候,遍历一次还没访问过的点 v,如果 uv 没边,那么将 v 入队.否则将 v 留在未扩展点中.很明显,后者只会发生 m 次,前者只会发生 n 次,所以复杂度是 O(n + m). 总得说,求补图的最短路就是要存原图,

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

http://acm.hdu.edu.cn/showproblem.php?pid=5876 题意: 在补图中求s到其余各个点的最短路. 思路:因为这道题目每条边的距离都是1,所以可以直接用bfs来做. 处理的方法是开两个集合,一个存储当前顶点可以到达的点,另一个存储当前顶点不能到达的点.如果可以到达,那肯定由该顶点到达是最短的,如果不能,那就留着下一次再判. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstr