POJ1308

来源:互联网 发布:淘宝1688批发 编辑:程序博客网 时间:2024/05/22 16:01
解题思路:这个题目要我们判断所给图是不是树,这里可以把条件转化为:1.图中没有环;2,图中每个节点除了根节点的入度都为1,根节点入度为0;
没有环和入度不大于1,可以更具kruskal的并查集思想判断。我做这题时忽略了只有一个节点是根节点,判断方法是根据每条边的起始点所在树的根节点来判断,如果每个边的起始点的根节点都相同,就是树,否则,不是树;
#include<iostream>#include<stdio.h>#include<stdlib.h>using namespace std;const int MAXSIZE =1000005;int father[MAXSIZE];struct node{int u;int v;}edge[MAXSIZE];void init(){for(int i=0;i<MAXSIZE;i++){father[i] = -1;}}int find(int x){if(father[x] ==-1){return x;}else{father[x] = find(father[x]);return father[x];}}void Union(int x,int y){father[y] = x;}int main(){int a,b;int t=1;int flag = 1;int k;while(scanf("%d%d",&a,&b)==2){flag = 1;k =0;if(a==-1&&b==-1)break;if(a==0&&b==0){cout<<"Case "<<t++<<" is a tree."<<endl;continue;}init();int p = find(a);int q = find(b);if(p == q||q!=b){flag = 0;}else Union(p,q);edge[k].u = a;edge[k++].v = b;while(cin>>a>>b&&a&&b){if(flag == 0) continue;p = find(a);q = find(b);if(p == q||q!=b){flag = 0;}else Union(p,q);edge[k].u = a;    edge[k++].v = b;}if(flag == 0) cout<<"Case "<<t++<<" is not a tree."<<endl;else { int u = find(edge[0].u); int i; for(i =1;i<k&&u==find(edge[i].u);i++) ;//判断其余边的其实点的根节点与第一条的是否相同。 if(i == k)  cout<<"Case "<<t++<<" is a tree."<<endl; else  cout<<"Case "<<t++<<" is not a tree."<<endl;}}return 0;}
原创粉丝点击