UVA 10720 Graph Construction
2016-07-15 11:50
253 查看
题意:
给你一些点的度数,问你能否构成一张简单图(即是无向图和不存在重边)。
思路:
以前刷图论的题目时,在POJ上做过类似的题目—— 青蛙的邻居POJ1659,那题是这题的加强版。就是根据Havel-Hakimi定理
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=10005;
int n,d[MAX];
bool cmp(int a,int b){
return a>b;
}
int main(){
while(~scanf("%d",&n),n){
for(int i=1;i<=n;i++){
scanf("%d",&d[i]);
}
sort(d+1,d+1+n,cmp);
bool flag=true;
int k=1;
while(1){
int tm=d[k];
if(tm==0&&k==n) break;
if(tm>n-k){
flag=false;
break;
}
for(int i=k+1;i<=k+tm;i++){
d[i]--;
if(d[i]<0){
flag=false;
break;
}
}
if(!flag){
break;
}
sort(d+1+k,d+1+n,cmp);
k++;
}
if(flag) printf("Possible\n");
else printf("Not possible\n");
}
return 0;
}
给你一些点的度数,问你能否构成一张简单图(即是无向图和不存在重边)。
思路:
以前刷图论的题目时,在POJ上做过类似的题目—— 青蛙的邻居POJ1659,那题是这题的加强版。就是根据Havel-Hakimi定理
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=10005;
int n,d[MAX];
bool cmp(int a,int b){
return a>b;
}
int main(){
while(~scanf("%d",&n),n){
for(int i=1;i<=n;i++){
scanf("%d",&d[i]);
}
sort(d+1,d+1+n,cmp);
bool flag=true;
int k=1;
while(1){
int tm=d[k];
if(tm==0&&k==n) break;
if(tm>n-k){
flag=false;
break;
}
for(int i=k+1;i<=k+tm;i++){
d[i]--;
if(d[i]<0){
flag=false;
break;
}
}
if(!flag){
break;
}
sort(d+1+k,d+1+n,cmp);
k++;
}
if(flag) printf("Possible\n");
else printf("Not possible\n");
}
return 0;
}
相关文章推荐
- 真流弊,4900元换年薪12万!
- Java语言实现六种排序算法
- iOS 类似小红书闪动标签点动画
- nohup 的用法
- 蓝牙流程
- CaysnPrinter开发包接口说明文档及打印示例程序 - 20160715
- HDFS 权限问题:Permission denied
- 最详细的文件上传下载实例详解(推荐)
- TEE概念
- 安装apache2.2.22时遇到的问题。
- linux后台运行和关闭、查看后台任务
- C语言的第二次复习
- 系统权限管理的简介及基于shiro实现权限管理
- Sybase IQ,你需要知道的基础
- C#基础-2:集合相关
- 命名空间
- 【Linux】Jenkins安装(一)
- 一次Win10安装体验
- NS3 fifth.cc 拥塞窗口实例
- KVO (key-value observing)的使用