Havel定理 就是圖的可判定性。今天剛學的,不多說了,大家google一下就懂了。
http://poj.org/problem?id=1659
#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>using namespace std;//由於要排序,需要用結構體儲存節點的 下標typedef struct node{int index;int f; //鄰居個數}Node;//比較函數。從大到小排序bool cmp(const Node n1,const Node n2){return n1.f > n2.f;}//列印圖void print_map(int arr[10][10],int m){for(int i=0; i<m; i++){for(int j=0; j<m; j++){if(j)cout << " "<<arr[i][j] ;elsecout <<arr[i][j];}cout << endl;}}Node nodes[10];int map[10][10];int main(){int n,m;scanf("%d",&n);while(n--){scanf("%d",&m);memset(map,0,sizeof(map)); //初始化為0for(int i=0; i<m;i++){scanf("%d",&nodes[i].f);nodes[i].index = i;}int flag = 0;//是否可以構成圖for(int i=0; i<m; i++){if(flag)break;sort(nodes+i,nodes+m, cmp); //迴圈排序for(int j=0; j<nodes[i].f; j++){ //後面的依次減1nodes[i+j+1].f --;if(nodes[i+j+1].f < 0){flag = 1;break;}map[nodes[i].index][nodes[i+j+1].index] = 1; //同時更新圖map[nodes[i+j+1].index][nodes[i].index] = 1; //對稱更新}}if(flag)cout << "NO" << endl;else{cout << "YES" << endl;print_map(map,m);}cout << endl;}return 0;}