Input
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<set> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define ls i<<1 #define rs ls | 1 #define mid ((ll+rr)>>1) #define pii pair<int,int> #define MP make_pair typedef long long LL; const long long INF = 1e18; const double Pi = acos(-1.0); const int N = 2e5+10, M = 1e2+11, mod = 1e9+7, inf = 2e9; int T,n,m,vis[N],head[N],t,d[N],ans[N]; struct ss{int to,next;}e[N * 2]; void add(int u,int v) {e[t].to=v;e[t].next=head[u];head[u]=t++;} int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); t =1;memset(head,0,sizeof(head)); for(int i = 1; i <= m; ++i) { int a,b; scanf("%d%d",&a,&b); add(a,b);add(b,a); } memset(vis,0,sizeof(vis)); memset(d,-1,sizeof(d)); int S; scanf("%d",&S); queue<int > q; q.push(S);vis[S] = 1; d[S] = 0; set<int > s; for(int i = 1; i <= n; ++i) if(i != S) s.insert(i),vis[i] = 1; while(!q.empty()) { int k = q.front(); q.pop(); for(int i = head[k]; i; i =e[i].next) { int to = e[i].to; if(s.count(to)) { vis[to] = 0; } } for(set<int > ::iterator itt,it = s.begin();it != s.end(); ) { if(vis[*it]) { d[*it] = d[k] + 1; q.push(*it); itt = it; itt++; s.erase(it); it = itt; } else { it++; } } for(set<int > ::iterator itt,it = s.begin();it != s.end(); it++) vis[*it] = 1; } int cnt = 0; for(int i = 1; i <= n; ++i) { if(i != S)ans[++cnt] = d[i]; } for(int i = 1; i < cnt; ++i) printf("%d ",ans[i]); printf("%d\n",ans[cnt]); } return 0; }
原文:http://www.cnblogs.com/zxhl/p/5869691.html