题目关键就是要保证两个点
- 这是一张无环图
- 这张图是一张连通图
这就变成一个并查集的模板题,每次加进来一条边只要判断两个顶点的根节点是否相同,如果相同说明遇到了环。然后判断这张图是连通图块数是否为1。
const int N=1010;
int p[N];
int n,m;
int find(int x)
{
if(x != p[x]) p[x]=find(p[x]);
return p[x];
}
int main()
{
while(cin>>n>>m,n+m)
{
for(int i=1;i<=n;i++) p[i]=i;
bool ok=true;
int cnt=n;
while(m--)
{
int a,b;
cin>>a>>b;
int pa=find(a),pb=find(b);
if(pa != pb)
{
p[pa]=pb;
cnt--;
}
else ok=false;
}
if(ok && cnt == 1) puts("Yes");
else puts("No");
}
//system("pause");
return 0;
}