/**
indegreeOne<node>:存放入度为1的所有节点。
indegreeZero<node>:存放入度为0的所有节点,
对边u,v:
indeg0:
若u不存在,那么u加入indeg0,并且检查v在不在indeg0中。若v在,直接寄
若u不存在于indeg0且不存在于indeg1,u入indeg0。
若v存在于indeg1,那么v出indeg0。
#include<set>
#include<cstdio>
int main(){
int u, v, treeNum=0, numEdges=0;
bool isTree = true;
std::set<int> indegreeOne;
std::set<int> indegreeZero;
while(true){
scanf("%d %d", &u,&v);
if(u==0&&v==0){
++treeNum;
if(numEdges==0||isTree&&indegreeZero.size()==1){
printf("Case %d is a tree.\n", treeNum);
}else{
printf("Case %d is not a tree.\n", treeNum);
isTree=true;
}
indegreeOne.clear();
indegreeZero.clear();
numEdges=0;
}else if(u==-1&&v==-1){
break;
}else{
++numEdges;
if(!isTree) continue;
if(indegreeOne.count(v)>0){
isTree=false;
}
indegreeOne.insert(v);
if(indegreeZero.count(u)==0&&indegreeOne.count(u)==0){
indegreeZero.insert(u);
}
indegreeZero.erase(v);
}
}
return 0;
}
indegreeOne<node>:存放入度为1的所有节点。
indegreeZero<node>:存放入度为0的所有节点,
对边u,v:
indeg0:
若u不存在,那么u加入indeg0,并且检查v在不在indeg0中。若v在,直接寄
若u存在,那么检查v即可。
indeg1:若u不存在于indeg0且不存在于indeg1,u入indeg0。
若v存在于indeg1,那么v出indeg0。
最后检查indeg1大小是不是1.
最后:一条边没有也算树,所以我加了一个numEdges变量来针对这个用例
*/#include<set>
#include<cstdio>
int main(){
int u, v, treeNum=0, numEdges=0;
bool isTree = true;
std::set<int> indegreeOne;
std::set<int> indegreeZero;
while(true){
scanf("%d %d", &u,&v);
if(u==0&&v==0){
++treeNum;
if(numEdges==0||isTree&&indegreeZero.size()==1){
printf("Case %d is a tree.\n", treeNum);
}else{
printf("Case %d is not a tree.\n", treeNum);
isTree=true;
}
indegreeOne.clear();
indegreeZero.clear();
numEdges=0;
}else if(u==-1&&v==-1){
break;
}else{
++numEdges;
if(!isTree) continue;
if(indegreeOne.count(v)>0){
isTree=false;
}
indegreeOne.insert(v);
if(indegreeZero.count(u)==0&&indegreeOne.count(u)==0){
indegreeZero.insert(u);
}
indegreeZero.erase(v);
}
}
return 0;
}