AcWing 1498. 最深的根
原题链接
中等
作者:
ちょっとジョーンソース
,
2021-03-22 19:51:30
,
所有人可见
,
阅读 1012
y总数据太强了吧,在PAT上wa了一个测试点,在这wa了6个QWQ
C++ 代码
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int cnt,n,x,y,book[21000][21000],vis[210000],s[210000],tes[210000],dis[2100000],maxn2;
int findf(int x)
{
if(s[x]==x)
{
return s[x];
}
return s[x]=findf(s[x]);
}
void unio(int x,int y)
{
int p=findf(x);
int q=findf(y);
if(p!=q)
{
s[q]=p;
}
}
int dfs(int x)
{
// if(dis[x])
// {
// return dis[x];
// }
int maxn1=0,flag=0;
for(int i=1; i<=n; i++)
{
if(!vis[i]&&book[x][i]!=inf)
{
flag=1;
vis[i]=1;
maxn1=max(maxn1,dfs(i)+1);
vis[i]=0;
}
}
if(!flag)
{
return 1;
}
else
{
return maxn1;
}
}
int main()
{
cin>>n;
memset(book,inf,sizeof(book));
for(int i=1; i<=n; i++)
{
s[i]=i;
}
for(int i=1; i<=n-1; i++)
{
cin>>x>>y;
//pes[x]=1;
book[x][y]=1;
book[y][x]=1;
unio(x,y);
}
for(int i=1; i<=n; i++)
{
if(s[i]==i)
{
cnt++;
}
}
if(cnt==1)
{
for(int i=1; i<=n; i++)
{
vis[i]=1;
tes[i]=dfs(i);
maxn2=max(maxn2,tes[i]);
vis[i]=0;
}
for(int i=1; i<=n; i++)
{
if(tes[i]==maxn2)
{
cout<<i<<endl;
}
}
//cout<<maxn2;
}
else
{
cout<<"Error: "<<cnt<<" components";
}
return 0;
}
复杂度呢,n方吗,不会超时吗
不会,$O(n^2)$是10^8,c++1秒可以算$10^8$,这里时间复杂度还是2s
QWQ