hdu 1325 水题

来源:互联网 发布:usb控制软件破解版 编辑:程序博客网 时间:2024/05/16 09:41

数据太坑爹了,数据范围很小,NN_MAX给大了会TLE,不知道为什么。注意不能有环,一个 结点不能有多个入度,有空树,还有森林的情况,1 1 0 0不是树,因为指向了自己。

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<string>#include<map>#include<set>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<sstream>#define LL long long#define OJ_DEBUG 0#define READ_FILE 1using namespace std;const int NN_MAX = 105;//const int MM_MAX = 100010;const int INF = 0x3fffffff;/**********************************************************/int p[NN_MAX];bool vis[NN_MAX];//set<int> sets;/**********************************************************///int min_2 (int x,int y) {return x<y?x:y;}//int max_2 (int x,int y) {return x>y?x:y;}//void swap (int& a, int& b){a^=b;b^=a;a^=b;}bool judge (int a,int b)//环{  do {if (b==p[a]) return false;a=p[a];  }while (p[a]!=a);  return true;}/**********************************************************/int main(){  if (READ_FILE) freopen ("in.txt","r",stdin);  int tt=1;  while (1)  {memset (vis,0,sizeof (vis));for (int i=0;i<NN_MAX;i++) p[i]=i;int a,b;bool yn=true;while (scanf ("%d %d",&a,&b)!=EOF){  if (a<0&&b<0) return 0;  if (a==0&&b==0) break;  if (yn){if (p[b]!=b) yn=false;//一个结点有多个入度if (!judge (a,b)) yn=false;p[b]=a;vis[a]=vis[b]=1;  }}if (!yn){  printf ("Case %d is not a tree.\n",tt++);  continue;}int cnt=0;for (int i=0; i<NN_MAX; i++)  if (vis[i] && i==p[i])  ++cnt;if (cnt>1)  printf ("Case %d is not a tree.\n",tt++);else printf ("Case %d is a tree.\n",tt++);  }  return 0;}


0 0