题目大意:判断一个序列是否可图化。Havel-Hakimi定理的简单应用。
在看D_Double's Journey的关于Havel-Hakimi定理时提到这道题,就做了一下。可悲的是,因为一些小细节问题WA了两次,无语...
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 #define MAXN 12 6 7 struct Vertex 8 { 9 int d, id; 10 bool operator < (const Vertex& v) const 11 { 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 LOCAL 40 freopen("in", "r", stdin); 41 #endif 42 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 }