题意: 给你一个数列, 判断是否可以构成一个图, 可以则输出 构成图的一种方式
构图根据 Havel-Hakimi定理来构图
(在排序的时候注意 节点下标会变化, 故用结构体)
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int maxn = 50; int Map[maxn][maxn]; struct Node { int val, pos; bool operator < (const Node a) const { return val > a.val; } }Num[maxn]; int main() { int T, N; cin >> T; while(T--) { bool Jug = true; cin >> N; memset(Map,0,sizeof(Map)); for(int i = 0; i < N; ++i) { cin >> Num[i].val; Num[i].pos = i; } for(int i = 0; i < N && Jug; ++i) { sort(Num+i,Num+N); / /*for(int k = 0; k < N; ++k) { if(k) cout << " "; cout << Num[k].val; } cout << endl;*/ // int Be = Num[i].pos; if(Num[i].val > N-i-1) Jug = false; for(int j = 1; j <= Num[i].val && Jug; ++j) { int Ed = Num[i+j].pos; Num[i+j].val--; if(Num[i+j].val < 0) Jug = false; else Map[Be][Ed] = Map[Ed][Be] = 1; } } if(!Jug) { puts("NO\n"); continue; } puts("YES"); for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(j) cout << " "; cout << Map[i][j]; } cout << endl; } cout << endl; } return 0; }