dfs找环的那个代码写的很烂= - =思路挺简单的,你找到环然后bfs一下就完事了
#include <bits/stdc++.h>
using namespace std;
const int N=3e3+5;
vector<int>v[N];
vector<int>cle;//存环上的点.
int dis[N];
int vis[N];
int flag=0,f=1;
void dfs(int u,int fa)
{
if(flag) return;
for(int i=0;i<v[u].size();i++)
{
int x=v[u][i];
if(x==fa) continue;
if(vis[x]&&!flag) { flag=x;cle.push_back(u); return;}
vis[x]=1;
dfs(x,u);
}
if(u!=flag&&flag&&f) {cle.push_back(u);}
if(u==flag) { cle.push_back(u);f=0; }
}
queue<int>q;
void bfs()
{
while(q.size())
{
int temp=q.front();
q.pop();
for(int i=0;i<v[temp].size();i++)
{
int x=v[temp][i];
if(dis[x]!=-1) continue;
dis[x]=dis[temp]+1;
q.push(x);
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
vis[1]=1;
dfs(1,0);//cout<<flag<<endl;
memset(dis,-1,sizeof dis);
//for(int i=0;i<cle.size();i++) cout<<cle[i]<<endl;
for(int i=0;i<cle.size();i++)
{
q.push(cle[i]);
dis[cle[i]]=0;
}
bfs();
for(int i=1;i<=n;i++) printf("%d ",dis[i]);
puts("");
return 0;
}
京公网安备 11010502036488号