syhd142 |
|
|||
日歷
統(tǒng)計(jì)
導(dǎo)航常用鏈接留言簿(2)隨筆檔案(23)文章分類(270)
文章檔案(122)我的豆瓣搜索最新評(píng)論
閱讀排行榜
評(píng)論排行榜 |
看著人家的代碼寫就是不好,還錯(cuò)了好幾次,雖說簡單還是自己靠得住。雖然可以用最大團(tuán)求解,但直接枚舉就好了。 規(guī)模小,看這個(gè)題就知道是求最大獨(dú)立集,而最大獨(dú)立集+最小覆蓋集=定點(diǎn)個(gè)數(shù),而原圖最大團(tuán)=補(bǔ)圖最大獨(dú)立集。各種性質(zhì)。 #include <stdio.h>
#include <string.h> #define N 105 bool g[N][N], color[N], mk[N]; int n, m, ans; bool ok(int u) { for(int i = 1; i <= n; i++) { if(g[u][i] && color[i]) return 0; } return 1; } void dfs(int u, int cnt) { if(u > n) { if(cnt > ans) { ans = cnt; for(int i = 1; i <= n; i++) mk[i] = color[i]; } return; } if(cnt + n - u + 1 <= ans) return; if(ok(u)) { color[u] = 1; dfs(u + 1, cnt + 1); color[u] = 0; } dfs(u + 1, cnt); } int main() { int t; scanf("%d", &t); while(t--) { ans = 0; memset(g, 0, sizeof(g)); memset(mk, 0, sizeof(mk)); memset(color, 0, sizeof(color)); scanf("%d %d", &n, &m); for(int i = 0; i < m; i++) { int a, b; scanf("%d %d", &a, &b); g[a][b] = g[b][a] = 1; } dfs(1, 0); printf("%d\n", ans); bool flag = 1; for(int i = 1; i <= n; i++) { if(mk[i]) { if(flag) flag = 0; else printf(" "); printf("%d", i); } } printf("\n"); } return 0; }
|
![]() |
|
Copyright © Fucker | Powered by: 博客園 模板提供:滬江博客 |