这道题用到了 异或操作 把一个无向图转化为有向图 从最外围的节点开始向深层的点一步一步的搜索 知道找到那个环 因为环的节点数都是2 a^b^a=b 用的就是这个公式
别忘了初始化
# include <stdio.h>
# include <string.h>
int dist[3001],p[3001];
void getdist(int i)
{
if(dist[i]==-1)
{
getdist(p[i]);
dist[i]=dist[p[i]]+1;
}
}
int main()
{
int deg[3001],q[3001],x[3001];//a表示的节点的个数
int n,qr=0,ql=0,v,w,e,a,b,i;
scanf("%d",&n);
memset(x,0,sizeof(x));
memset(q,0,sizeof(q));
memset(dist,0,sizeof(dist));
memset(p,0,sizeof(p));
memset(deg,0,sizeof(deg));
for(i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
deg[a]++;
deg[b]++;
x[a]^=b;
x[b]^=a;
}
for(i=1;i<=n;i++)
{
if(deg[i]==1)
q[qr++]=i;
}
while(ql<qr)
{
v=q[ql];
dist[v]=-1;
e=x[v];
p[v]=e;
x[e]^=v;
deg[e]--;
if(deg[e]==1)
{
q[qr++]=e;
}
ql++;
}
getdist(1);
printf("%d",dist[1]);
for(i=2;i<=n;i++)
{
getdist(i);
printf(" %d",dist[i]);
}
printf("\n");
return 0;
}