HRBEU ACM 图论 1006

http://acm.hrbeu.edu.cn/index.php?act=problem&id=1006&cid=22

题目的意思:任何一个简单图都有一个度序列(度序列的定义是,对于简单图中每个顶点的度数),那么反过来,任给一个非负整数的非递增序列是不是就一定对应着一个简单图呢?现在题目中就是给你这样的一段非负整数序列然你判断是否可以画出一个简单图。

解题思路:根据Havel定理:对于n>1,大小为n的整数序列d是简单图的度序列,当且仅当d''是简单图的度序列。其中d''是删除d中最大的元素a后(a<n),并且将紧跟的a个最大元素依次减一得到的度序列。含一个元素的简单图的度序列只有是d1=0。

(1)如果度序列的和为奇数,则该度序列肯定不是简单图的度序列。因为一个简单图的度的和为边数的2倍,一定为偶数。

(2)在每次重新排序后判断最后一个元素是否小于零,如果小于零则可直接判断这个序列不是简单图的度序列。

下面就是代码实现了。不过这个代码没有通过,提交后是PE,真的看不出来题目是怎么要求输出的,单个输出,一起输出都尝试了,还是不对,感觉没什么特别的呀

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 #define N 1010
7 char str[N][10];
8 int de[N];
9 int cmp(const int a,const int b)
10 {
11 return a>b;
12 }
13 int main()
14 {
15 int t,n;
16 int i,j;
17 int k;
18 cin>>t;
19 //while(cin>>t)
20 //{
21 for(k=0;k<t;k++)
22 {
23 int s=1;
24 cin>>n;
25 for(i=0;i<n;i++)
26 cin>>de[i];
27 sort(de,de+n,cmp);
28 for(i=0;i<n-1;i++)
29 {
30 for(j=1;j<=de[0];j++)
31 {
32 if(j>n-i||de[j]<=0)
33 {
34 s=0;
35 break;
36 }
37 de[j]--;
38 }
39 de[0]=-1;
40 sort(de,de+n,cmp);
41 if(!s) break;
42 }
43 if(!s||de[0]!=0) strcpy(str[k],"no");
44 else if(s==1&&!de[0]) strcpy(str[k],"yes");
45
46 }
47 for(i=0;i<t;i++)
48 cout<<str[i]<<endl;
49 //}
50 return 0;
51 }

 

posted @ 2011-12-07 20:39  AC_Girl  阅读(209)  评论(0编辑  收藏  举报