题目:http://acm.hdu.edu.cn/showproblem.php?pid=1272
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 100001
using namespace std;
int set[maxn],num[maxn];
int find(int x)
{
if(set[x] == x)return x;
return set[x] = find(set[x]);
}
int main()
{
int n,m,pos;
while(scanf("%d%d",&n,&m))
{
if(m==-1 && n==-1)break;
if(m==0 && n==0){puts("Yes");continue;}
memset(num,0,sizeof(num));
num[n] = num[m] = 1;
for(int i =1; i <= maxn; i++)
set[i] = i;
pos = 0;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
while(scanf("%d%d",&n,&m),(n&&m))
{
num[n] = num[m] = 1;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
}
if(pos){puts("No");continue;} //判断有没有成环
int count = 0; //判断是不是所有的点共有一个根
for(int i = 1; i < maxn; i++)
{
if(num[i] && find(i) == i)
{
count++;
}
}
if(count==1) puts("Yes");
else puts("No");
}
return 0;
}
之前未AC代码:我的思路也写在里面:
(2013/7/25)找到错误了。数组开小了。正确的写法应该把那个判断条件放在后面。注释有标记
或者把数组 开到 10001以上 才能包容这个错误
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 100001
using namespace std;
int set[maxn],num[maxn];
int find(int x)
{
if(set[x] == x)return x;
return set[x] = find(set[x]);
}
int main()
{
int n,m,pos;
while(scanf("%d%d",&n,&m))
{
if(m==-1 && n==-1)break;
if(m==0 && n==0){puts("Yes");continue;}
memset(num,0,sizeof(num));
num[n] = num[m] = 1;
for(int i =1; i <= maxn; i++)
set[i] = i;
pos = 0;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
while(scanf("%d%d",&n,&m),(n&&m))
{
num[n] = num[m] = 1;
if(find(n)==find(m))pos = 1;
else
set[find(n)] = find(m);
}
//////////////////////////////只有下面几行不同;
/////这样做的思路是用pos总的来判断要输出Yes还是No
int count = 0;
for(int i = 1; i < maxn; i++)
{
if(count > 1)//应该放下面
{
pos = 1; //如果形成的迷宫不只一个根节点,则pos为1;最后判断就会输出No
continue;
}
if(num[i] && find(i) == i)
{
count++;
} //应该放这后面
}
if(pos) puts("No");
else puts("Yes");
}
return 0;
}
2013/7/25
重做此题,一直WA。原因在于没判断 直接输出Yes
代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
#define maxn 100000+5
struct EDGE
{
int u;
int v;
} edge[maxn/2];
int father[maxn];
void InIt(int len)
{
for(int i = 0; i < len; i++)
{
father[edge[i].u] = edge[i].u;
father[edge[i].v] = edge[i].v;
}
}
int find(int a)
{
if(father[a]==a) return a;
else
return father[a] = find(father[a]);
}
int main()
{
int a,b;
int len = 0;
while(scanf("%d%d",&edge[len].u,&edge[len].v))
{
if(edge[len].u==-1 && edge[len].v==-1)
break;
if(edge[len].u==0 && edge[len].v==0)
{
puts("Yes");
continue;
}
len++;
while(scanf("%d%d",&edge[len].u,&edge[len].v) && (edge[len].u + edge[len].v))
{
len++;
}
InIt(len);
int fa,fb;
int flag = 1;
for(int i = 0; i < len; i++)
{
if(edge[i].u == edge[i].v)
{
flag = 0;
break;
}
fa = find(edge[i].u);
fb = find(edge[i].v);
if(fa==fb)
{
flag = 0;
break;
}
else
{
father[fa] = fb;
}
}
if(!flag)
{
puts("No");
continue;
}
int ans = find(edge[0].u);
for(int i = 0; i < len; i++)
{
if(ans != find(edge[i].u))
{
flag = 0;
break;
}
}
if(!flag)
puts("No");
else
puts("Yes");
len = 0;
}
}
HDU1325&&POJ1308
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn=10000;
int father[maxn];//父节点
int into[maxn];//入度
int flag[maxn];//标记是否出现
bool istree;//合并时 中间标记
void InIt()//初始化
{
for(int i=1; i<=maxn; i++)
{
father[i]= i;
into[i]= 0;
flag[i]= 1;
}
}
int find(int v) //查找
{
if(father[v]!=v)
father[v]=find(father[v]);
return father[v];
}
void merge(int x,int y) //合并
{
int xf=find(x);
int yf=find(y);
if(xf==yf)
{
istree=0;
return ;
}
father[xf]= yf;
}
int main()
{
int x,y,t,n;
t=1;
while(scanf("%d%d",&x,&y)!=EOF)
{
istree=1;
n=0;
InIt();//初始化
if(x<0||y<0) return 0;
if(x==0&&y==0)
{
cout<<"Case "<<t++<<" is a tree."<<endl;
continue;
}
if(x!=y)into[y]=1;
if(flag[x]==1)
{
n++;
flag[x]=0;
if(flag[y]==1)
{
n++;
flag[y]=0;
}
merge(x,y);
while(scanf("%d%d",&x,&y),(x!=0&&y!=0))
{
if(x!=y)
into[y]=1;
if(flag[x]==1)
{
n++;
flag[x]=0;
}
if(flag[y]==1)
{
n++;
flag[y]=0;
}
merge(x,y);
}int sum=0;
for(int i=1; i<=maxn; i++)
sum+=into[i];
if(sum==n-1&&istree)
cout<<"Case "<<t++<<" is a tree."<<endl;
else
cout<<"Case "<<t++<<" is not a tree."<<endl;
}
}return 0;
}