HDU 5876 Sparse Graph2016 ACM/ICPC Asia Regional Dalian Online 1009

来源:互联网 发布:傲剑金蛇升级数据大全 编辑:程序博客网 时间:2024/05/16 23:42

【题意】对无向图的补图求最短路

BFS:

维护一个set,里面保存还没有被访问的节点,每次bfs的时候,把与点u相连的点排除,那么剩余的点在补图里都与点u可以有一条权为1的边,访问完之后即把这些点从set里删除。也就是说扩展节点时候,只扩展与u没有边相连的点,有相边相邻的点留在外面等下一次再扩展。

【代码】

#include<stdio.h>#include<stdlib.h>#include<cstdio>#include<cstring>#include<queue>#include<set>#include<algorithm>using namespace std;const int MAXN = 2e5 + 5;const int INF = 0x3f3f3f3f;typedef long long LL;int head[MAXN], e;LL dis[MAXN];int vis[MAXN];struct Edge{int v, nxt, w;}E[MAXN];int N, M, S;void init(){e = 1;memset(head, 0, (N + 1) * sizeof(int));memset(vis, 0, (N + 1) * sizeof(int));}void add(int u, int v, int w){E[e].v = v;E[e].w = w;E[e].nxt = head[u];head[u] = e++;}struct QNode{int v, c;QNode(int _v, int _c){v = _v; c = _c;}bool operator < (const QNode &a) const{return c>a.c;}};void BFS(int st, int n){set<int>ta, tb;     //维护一个未BFS的集合,tb是tempqueue<int>Q;    Q.push(st);dis[st] = 0;for (int i = 1; i <= n; i++) //初始化if (i != st)ta.insert(i);while (!Q.empty()){int u = Q.front(); Q.pop();for (int i = head[u]; i; i = E[i].nxt){ //把和u之间有边的点排除int v = E[i].v;if (!ta.count(v)) continue;  ta.erase(v); tb.insert(v);}for (set<int>::iterator it = ta.begin(); it != ta.end(); it++){ //扩展Q.push(*it);dis[*it] = dis[u] + 1;}ta.swap(tb); //原ta里面除了tb里的没访问之外都访问了tb.clear();}}int main(void) {int T;while (scanf("%d", &T) != EOF){int i;int u, v;for (; T; T--){scanf("%d%d", &N, &M);init();for (i = 1; i <= M; i++){scanf("%d%d", &u, &v);add(u, v, 1); add(v, u, 1);}for (i = 1; i <= N; i++){dis[i] = INF;}scanf("%d", &S);BFS(S, N);bool first = true;for (i = 1; i <= N; i++){if (i == S)continue;if (false == first)printf(" ");first = false;if (dis[i] == INF)printf("-1");elseprintf("%d", dis[i]);}printf("\n");}}return 0;}


0 0