吝啬的国度
1、广搜(从结点s开始 往外逐层搜索)
# include<iostream> # include<string> # include<queue> # include<stdio.h> using namespace std; int u[200005],v[200005],w[200005],first[200005],next[200005],d[200005]; queue<int> q; int main() { int n,m,s; cin>>m; while(m--) { cin>>n>>s; int i,k; for(i=1;i<=2*n;i++) first[i] = -1; for(i=1;i<2*n-1;i+=2) //无向边相当于两条有向边 { scanf("%d %d",&u[i],&v[i]); u[i+1] = v[i]; v[i+1] = u[i]; w[i] = 1; //w[i]=1表示该路径尚未经过 w[i+1] = 1; d[i] = 0; d[i+1] = 0; next[i] = first[u[i]]; first[u[i]] = i; next[i+1] = first[u[i+1]]; first[u[i+1]] = i+1; } // for(i=1;i<2*n-1;i++) // printf("%d %d %d %d %d\n",first[i],next[i],u[i],v[i],w[i]) ; q.push(first[s]); int count = n; while(!q.empty()) { k = q.front(); q.pop(); while(k!=-1 && w[k]!=0) { if(d[v[k]]==0) { d[v[k]] = u[k]; } w[k] = 0; q.push(first[v[k]]); k = next[k]; } } for(i=1;i<=n;i++) { if(i!=s) printf("%d",d[i]); else printf("-1"); if(i!=n) printf(" "); else printf("\n"); } } return 0; }