Codeforces 131D. Subway 寻找环-树的最短路径
#include <iostream> #include <cstring> using namespace std; bool a[4111][4111]; int n; bool v[4111]={0}; int p[4111]={0}; int cnt=0; int ans[4111]={0}; bool dfs_find(int i,int lt) { v[i]=true; for (int j=1;j<=n;j++) { if (a[i][j]>0&<!=j&&i!=j) { if (v[j]) { p[cnt++]=j; return true; } else { p[cnt++]=j; if (dfs_find(j,i)) { return true; } cnt--; } } } return false; } void dfs(int i) { for (int j=1;j<=n;j++) { if (i!=j&&a[i][j]>0&&ans[j]==-1) { ans[j]=ans[i]+1; dfs(j); } } } int main() { memset(a,0,sizeof(a)); memset(ans,-1,sizeof(ans)); cin>>n; for (int i=1;i<=n;i++) { int x,y; cin>>x>>y; a[x][y]=a[y][x]=1; } p[cnt++]=1; dfs_find(1,0); ans[p[cnt-1]]=0; for (int i=cnt-2;i>=0;i--) { if (p[i]==p[cnt-1]) break; ans[p[i]]=0; } for (int i=1;i<=n;i++) { if (ans[i]==0) { dfs(i); } } for (int i=1;i<=n;i++) { cout<<ans[i]<<" "; } cout<<endl; return 0; }