题目描述
DD和QQ在玩游戏,DD在地上画了一棵树(图论中的树),然后他告诉QQ这棵树的度数序列。QQ马上说这不是一棵树。DD认为自己被QQ鄙视了,他们吵了起来。
但DD随后发现自己算错了度数序列,QQ说的是对的。DD很奇怪为什么QQ反应得这么快。
现在给出一个图的度数序列,你需要做的就是像QQ一样:判断这是否可能是一棵树的度数序列。
输入格式
输入只有一行,首先给出一个整数 NN,表示顶点个数,后面跟着 NN 个整数,表示这个图的度数序列,每个数不超过 100100。
输出格式
如果输入可能是一棵树的度数序列,则输出“Possible”,否则输出“Impossible”。
输入输出样例
输入 #1
1 0
输出 #1
Possible
输入 #2
2 1 1
输出 #2
Possible
输入 #3
3 2 2 2
输出 #3
Impossible
输入 #4
3 1 2 1
输出 #4
Possible
分析:
一道树论题……
给出度 我们先把度数累加
判断:如果度数总和 = ( =( =(点数 n − 1 ) ∗ 2 n-1)*2 n−1)∗2(结论)以及 这个度数总和是偶数
那么 t a ta ta就可能是一棵树 否则不可能 要加特判 过第一个样例 以及树是联通的
所以不存在度数为 0 0 0的点(除点数 n = 1 n=1 n=1) 可直接输出 “ I m p o s s i b l e ” “Impossible” “Impossible”
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#pragma GCC optimize(2)
using namespace std;
int n,x,qwq;
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%d",&x);
if(n==1&&x==0){
printf("Possible"); //特判
return 0;
}
if(x==0){
//不存在
printf("Impossible");
return 0;
}
qwq+=x; //累加度数
}
if(qwq==(n-1)*2&&qwq%2==0){
//树的性质
printf("Possible");
return 0;
}else{
printf("Impossible");
return 0;
}
return 0;
}