题意:n个点,m条边,n,m<=2e5 合法的一个图为:X-Y,Y-Z有边,则X-Z也有边,判断该图是否合法
观察得到 同一个连通分量内,因为u,x联通,若最长路径长度为l 则u->长度2,3..l都必须有直接相连的边,所以任意两点都必须存在直接相连的边,
dfs求出每个连通分量的点数n,合法的图边数要求边=C(n,2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+20;
vector<int> e[N];
int vis[N],n,m;
ll cnt,res;
void dfs(int u)
{
vis[u]=1;
cnt++;//vertex
res+=e[u].size();//edge
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i];
if(vis[v]==0)
dfs(v);
}
}
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
e[i].clear();
int u,v;
bool flag=true;
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
cnt=0,res=0;//点数和边数
dfs(i);
if(cnt*(cnt-1)/2!=res/2)
{
flag=false;
break;
}
}
}
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}