強連通分量 耍朋友

2021-06-05 18:40:05 字數 2265 閱讀 4874

【問題描述】

春天來了,樂樂在某一天的中午做了乙個奇怪而又溫馨的夢,以下是夢境的描述:

綿中21xx 級信奧班實現了男女人數平均,歐教本著「人人都有朋友耍,人人都有一等

拿」的教學原則,準備為機房的每個同學牽紅線。並且由於21xx 年世界男女比例對男生有

現給出每個男生喜歡哪些女生(沒錯,是哪些,因為在樂樂的夢裡乙個男生喜歡n 個

女生都是很符合邏輯的),並給出歐教已經安排好的一種匹配方式。

問:在滿足「人人都有朋友耍」的原則下,每個男生可以和哪些女生耍朋友而不會出現

讓其他男生無朋友可耍的情況(包括歐教已經安排好的原配)。

【輸入資料】

第一行乙個整數n,表示有n 個男生和n 個女生。

接下來n 行每行若干個整數m,a1,a2,…,am。第i 行表示第i 個男生喜歡m 個女生,她

們分別是a1,a2,…,am。

最後一行共n 個整數,第i 個整數di 表示歐教給出的第i 個男生的原配是di。

【輸出資料】

共 n 行,每行若干個整數c,b1,b2,…,bc。第i 行表示第i 個男生可以和c 個女生耍朋

友,這些女生是b1,b2,…,bc。(女生的編號務必按照從小到大的順序輸出,女孩包含歐

教事先給出的原配。)

【樣例輸入】

42 1 2

2 1 2

2 3 4

2 3 4

1 2 3 4

【樣例輸出】

2 1 2

2 1 2

2 3 4

2 3 4

【樣例解釋】

圖①為一種匹配方式(歐教給出的原配);圖②為滿足原則的另一種匹配。

【資料範圍及約定】

1≤n≤2000。

由於大家都還是高中生,不會特別花心,所以總的關係數不會超過150000 條。

這道題一看到很像二分圖匹配。

但是看到題目,總是會感覺匈牙利演算法怎麼用都用不上。

於是,我們沿著匈牙利演算法的思路來繼續想這道題。

首先,匈牙利演算法從左半集出發,通過一條匹配邊、一條非匹配邊、一條匹配邊……最終到達右半集,這時匹配數+1。

能不能用類似這樣的方法但讓匹配數不加一呢?(也就是換乙個匹配。)

當然可以!直接構成乙個環就行了。

於是,將所有原配建成從右到左的邊,把其餘的建成從左到右的邊,這樣就可以用tarjan找出強連通分量,最後在所有的強連通分量中找出其中含有的邊即可,即為所有可行的匹配。

accode:

#include #include #include #include #define min(a, b) ((a) < (b) ? (a) : (b))

const int maxn = 2010;

struct edge ;

edge *edge[maxn << 1];

bool marked[maxn << 1], mp[maxn][maxn];

int dfn[maxn << 1], low[maxn << 1];

int stack[maxn << 1], belong[maxn << 1];

int link[maxn], n, bcnt, ind, top;

inline int getint()

inline void ins(int u, int v)

void tarjan(int u)

else if (marked[p -> v])

low[u] = min(low[u], dfn[p -> v]);

}if (dfn[u] == low[u])

while (tmp != u);

}return;

}int main()

for (int i = 1; i < n + 1; ++i)

for (int j = 1; j < n + 1; ++j)

if (mp[i][j] && link[j] != i)

ins(i, j + n);

for (int i = 1; i < n + 1; ++i)

if (dfn[i]) tarjan(i);

for (int i = 1; i < n + 1; ++i)

return 0;

}#undef min

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

強連通分量

對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...

強連通分量

在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...