組隊(最大團)

2021-06-10 03:10:57 字數 1316 閱讀 4028

【問題描述】

小秋秋想出去玩了。。

小秋秋有許多朋友,有一些小秋秋的朋友相互之間也是朋友。。。

小秋秋覺得自己帶不是朋友的兩個朋友出去玩會出現尷尬。。。(好糾結)

小秋秋想知道自己最多可以帶多少朋友出去玩以及帶人最多的方案數。。

【輸入檔案】(input.txt)

第一行兩個數,n,m分別表示小秋秋的朋友數,以及他們之間相互認識的關係對數。

接下來m行,每行兩個整數x,y表示朋友x和朋友y他們相互認識。

【輸出檔案】(output.txt)

一行兩個整數,分別表示能選出一起出去玩的最大人數,以及能達到最大人數的方案數。

【樣例輸入】

4 51 2

2 33 1

1 42 4

【樣例輸出】

3 2【資料約定】

test 0 1 2 3 4 5 6 7 8 9

n 5 10 15 20 25 30 35 40 45 50

考場上隨便亂狀壓了一下,沒有考慮 n > 20 的情況,搞了三十分。

1.位運算壓縮鄰接矩陣。每次判斷只需要 o(1) 的時間。

2.最優化剪枝。如果當前所搜到的點所在團的最大值加上當前的答案比最大答案要小,那麼肯定可以剪枝,因為不可能更優了。

code :

#include #include #include #include #define swap(a, b, t) ()

#define max(a, b) ()

#define min(a, b) ()

#define maxn 55

#define fill(a, i) ((a) | (1ll << (i) - 1))

#define full(a, i) (((a) >> (i) - 1) & 1ll)

int n, m, ans1, ans2;

long long e[maxn];

int maxi[maxn];

void renew(int x)

void dfs(int u, int sum, long long now)

int main()

for (int i = 1; i <= n; ++ i) e[i] = fill(e[i], i);

for (int i = n; i >= 1; -- i)

dfs(i, 1, fill(0, i)), maxi[i] = ans1;

printf("%d %d\n", ans1, ans2);

return 0;

}

最大團,極大團

團 對於給定圖g v,e 其中,v 是圖g的頂點集,e是圖g的邊集。圖g的團就是乙個兩兩之間有邊的頂點集合。簡單地說,團是g的乙個完全子圖。如果乙個團不被其他任一團所包含,即它不是其他任一團的真子集,則稱該團為圖g的極大團 maximal clique 頂點最多的極大團,稱之為圖g的最大團 maxi...

最大團問題

include cstdio include queue include cstring define max 20 using namespace std int n 城市數量 int x max 解向量 struct node priority queuepq void enqueue int ...

最大團問題

最大團問題 首先介紹一些基本概念 1 什麼是團?如果乙個子圖是乙個無向圖的完全子圖,那麼可以稱為乙個團。2 什麼是極大團?如果乙個團不是任何乙個團的子集,那麼可以稱做乙個極大團。3 如果乙個極大團的大小是最大的,那麼可以被稱為乙個最大團。最大團有以下常見性質,這裡不加證明的直接給出結論。最大團點的數...