题目大意:判断一个序列是否可图化。Havel-Hakimi定理的简单应用。
在看的关于时提到这道题,就做了一下。可悲的是,因为一些小细节问题WA了两次,无语...
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 using namespace std; 5 #define MAXN 12 6 7 struct Vertex 8 { 9 int d, id;10 bool operator < (const Vertex& v) const11 {12 return d > v.d;13 }14 };15 Vertex vertex[MAXN];16 int G[MAXN][MAXN], n;17 18 bool Havel_Hakimi()19 {20 for (int i = 0; i < n-1; i++)21 {22 sort(vertex+i, vertex+n);23 if (i + vertex[i].d >= n) return false;24 int x = vertex[i].id;25 for (int j = i+1; j <= i+vertex[i].d; j++)26 {27 vertex[j].d--;28 int y = vertex[j].id;29 G[x][y] = G[y][x] = 1;30 if (vertex[j].d < 0) return false;31 }32 }33 if (vertex[n-1].d) return false;34 return true;35 }36 37 int main()38 {39 #ifdef LOCAL40 freopen("in", "r", stdin);41 #endif42 int T;43 scanf("%d", &T);44 while (T--)45 {46 scanf("%d", &n);47 for (int i = 0; i < n; i++)48 {49 scanf("%d", &vertex[i].d);50 vertex[i].id = i;51 }52 memset(G, 0, sizeof(G));53 if (Havel_Hakimi()) 54 {55 printf("YES\n");56 for (int i = 0; i < n; i++)57 for (int j = 0; j < n; j++)58 printf("%d%s", G[i][j], (j == n-1) ? "\n" : " ");59 }60 else printf("NO\n");61 if (T) printf("\n");62 }63 return 0;64 }