UVA 10720

  题目大意是给定n个顶点的度,Havel-Hakimi判断有没有可能构成一个图。贪心法,每次选择当前集合中度最大的顶点,假设其度为k,那么我们尽可能和其之后度前k大的节点相连,若为0,则不可能,但没想到这还是一个名字听起来特别高端的定理,Havel-Hakimi定理。注意剪枝,并且这里有一个让本人wa了n次的概念性问题就是,简单图可以使不连通的。

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int d[10010];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int n;
	while(cin>>n&&n){
		int sum=0;
		bool mark=true;
		for(int i=0;i<n;i++) {
			cin>>d[i];sum+=d[i];
			if(d[i]>=n) mark=false;
		}
		if((sum&1)||sum>(n*(n-1))||!mark) {printf("Not possible\n");continue;}// 加上||sum<((n-1)<<1)则WA
		for(int i=0;i<n;i++){ 
			sort(d+i,d+n,cmp);
			if(!d[i]) break;
			int t=d[i];
			for(int j=i+1;j<n&&t;j++){
				if(!d[j]) break;
				d[j]--;t--;
			}
			if(t) {mark=false;break;}
		}
		if(!mark) printf("Not possible\n");
		else printf("Possible\n");
	}
	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值