地址:http://acm.hdu.edu.cn/showproblem.php?pid=1325
思路:DFS/并查集 对比AC的代码交了40多遍,心态搞炸,结果发现是输入u<0,v<0时退出而不是==-1,ヽ(`Д´)ノ︵ ┻━┻ ┻━┻
思路一:DFS,首先判断是否只有一个根节点,再DFS来判断是否有环路,以及有多个块
思路二:并查集,1.判断环路Find(u)==Find(v),2.以及父节点只有一个pre[v]!=v。3,节点个数=边数+1即可
Code 1:
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
const int MAX_N=1e5+5;
int n;
set<int> iset;
int pre[MAX_N];
int Find(int x){
if(pre[x]!=x) pre[x]=Find(pre[x]);
return pre[x];
}
void Union(int a,int b){
pre[Find(b)]=Find(a);
}
int main()
{
ios::sync_with_stdio(false);
int u,v,t=1,ss;
while(cin>>u>>v){
if(u<0&&v<0) break;
if(!u&&!v){
cout<<"Case "<<t++<<" is a tree."<<endl;
continue;
}
ss=1;
iset.clear();
for(int i=0;i<MAX_N;++i)
pre[i]=i;
int p=0;
iset.insert(u); iset.insert(v);
Union(u,v);
while(cin>>u>>v){
if(!u&&!v) break;
++ss;
iset.insert(u); iset.insert(v);
if(pre[v]!=v||Find(u)==Find(v)) p=-1;
Union(u,v);
}
if(ss+1!=iset.size()) p=-1;
cout<<"Case "<<t++;
if(p==-1) cout<<" is not a tree."<<endl;
else cout<<" is a tree."<<endl;
}
return 0;
}
Code 2:
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
const int MAX_N=10055;
int n,p;
set<int> iset;
vector<int> e[MAX_N];
bool d[MAX_N],boo[MAX_N];
void DFS(int u,int pre);
int main()
{
ios::sync_with_stdio(false);
int u,v,t=1;
while(cin>>u>>v){
iset.clear();
memset(e,0,sizeof(e));
memset(d,0,sizeof(d));
memset(boo,0,sizeof(boo));
if(u==-1&&v==-1) break;
do{
if(!u&&!v) break;
e[u].push_back(v);
iset.insert(u); iset.insert(v);
boo[u]=boo[v]=d[v]=true;
cin>>u>>v;
}while(u&&v);
p=0;
set<int>::iterator c=iset.begin();
for(;c!=iset.end();++c)
if(!d[*c]){
if(p){
p=-1; break;
}else p=*c;
}
if(p!=-1){
boo[p]=false;
DFS(p,-1);
set<int>::iterator c=iset.begin();
for(;c!=iset.end();++c)
if(boo[*c]){
p=-1; break;
}
}
cout<<"Case "<<t++;
if(p==-1) cout<<" is not a tree."<<endl;
else cout<<" is a tree."<<endl;
}
return 0;
}
void DFS(int u,int pre)
{
if(p==-1) return;
vector<int>::iterator v=e[u].begin();
for(;v!=e[u].end();++v)
if(*v!=pre){
if(!boo[*v]){
p=-1; break;
}
boo[*v]=false;
DFS(*v,u);
}
}