题目大意:给出一个图,注意这是个有向图(小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)),由于这个错误调试了一上午
解决:与poj 1308 一模一样,用并查集判断图的连通性,统计结点和边的个数来判断是否有回路
#include <iostream>
#include <set>
#include <utility>
using namespace std;
int num[100005];
bool mark[100005];
int Max;
set<pair<int,int> > s;
int find(int x)
{
int t=x,a;
while(num[t]>0)t=num[t];
for(int i=x;num[i]>0; i=num[a])
{
a=i;
num[i]=t;
}
return t;
}
void merge(int a,int b)
{
int fa=find(a);
int fb=find(b);
if(fa==fb)return ;
int t=num[fa]+num[fb];
if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;}
else {num[fb]=fa;num[fa]=t;}
}
void init()
{
Max=-1;
s.clear();
memset(num,-1,sizeof(num));
memset(mark,0,sizeof(mark));
}
int main()
{
int a,b,cnt=0,edge=0,vex=0;
init();
while(scanf("%d%d",&a,&b),a>=0 && b>=0)
{
if(a==0 && b==0)
{
for(int i=1;i<=Max && cnt!=2;i++)
{
if( mark[i] )
{
vex++;
if(num[i]<0)cnt++;
}
}
edge=s.size();
//判断0 0的情况
if(cnt==0 && vex==0 && edge==0){printf("Yes\n");continue;}
if(cnt==1 && edge==vex-1)printf("Yes\n");
else printf("No\n");
cnt=0;
edge=0;
vex=0;
init();
continue;
}
if(a!=b)
{
s.insert(make_pair(b,a));
merge(a,b);
}
if(a>Max)Max=a;
if(b>Max)Max=b;
mark[a]=mark[b]=true;
}
// system("pause");
return 0;
}
浙公网安备 33010602011771号