数据范围:3000
DFS 为什么会 TLE,是卡死循环了吗?
求指正或 hack。
#include<bits/stdc++.h>
using namespace std;
int n , x , y , s;
bool a[3005][3005] , ring[3005];
int finds(int t , int last)
{
if(ring[t])
{
return t;
}
ring[t] = 1;
for(int i = 1 ; i <= n ; i++)
{
if(a[i][t] && i != last)
{
return finds(i , t);
}
}
ring[t] = 0;
return 0;
}
bool dfs(int t , int last)
{
if(ring[t])
{
return 1;
}
bool flag = 0;
ring[t] = 1;
for(int i = 1 ; i <= n ; i++)
{
if(a[i][t] && i != last)
{
flag = flag || dfs(i , t);
}
}
ring[t] = 0;
if(flag)
{
ring[t] = 1;
}
return flag;
}
int ans(int t , int last)
{
if(ring[t])
{
return 0;
}
int cnt = 2000000009;
for(int i = 1 ; i <= n ; i++)
{
if(a[i][t] && i != last)
{
cnt = min(cnt , ans(i , t) + 1);
}
}
return cnt;
}
int main()
{
ios::sync_with_stdio(0);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> x >> y;
a[x][y] = a[y][x] = 1;
}
s = finds(1 , 0);
for(int i = 1 ; i <= n ; i++)
{
ring[i] = 0;
}
dfs(s , 0);
for(int i = 1 ; i <= n ; i++)
{
cout << ans(i , 0) << ' ';
}
return 0;
}