日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

POJ1904 强联通(最大匹配可能性)

發(fā)布時(shí)間:2025/6/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ1904 强联通(最大匹配可能性) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? 有n個(gè)王子,n個(gè)公主,然后給你每個(gè)王子喜歡的公主,最后問(wèn)你在不影響最大匹配的前提下,每個(gè)王子可以匹配那些公主。

思路:

? ? ? 是hdu4685的減弱版,之前研究過(guò)hdu4685所以這個(gè)題目直接水過(guò)了,對(duì)于這個(gè)題目,我們把王子和他喜歡的公主之間建連邊,建立一個(gè)二分圖,然后對(duì)于題目給的已經(jīng)匹配好了的(有的題目沒(méi)給,直接就自己跑一邊二分匹配自己找),之間建立反邊,就是建立公主到王子的邊,然后一遍強(qiáng)聯(lián)通,如果同意個(gè)分量里的男女可以匹配。這樣記錄每一個(gè)然后sort一下就行了。

#include<stdio.h> #include<string.h> #include<algorithm> #include<stack>#define N_node 5000 #define N_edge 1000000using namespace std;typedef struct {int to ,next; }STAR;STAR E1[N_edge] ,E2[N_edge]; int list1[N_node] ,list2[N_node] ,tot; int Belong[N_node] ,cont; int mark[N_node]; int ans[N_node]; stack<int>st;void add(int a ,int b) {E1[++tot].to = b;E1[tot].next = list1[a];list1[a] = tot;E2[tot].to = a;E2[tot].next = list2[b];list2[b] = tot; }void DFS1(int s) {mark[s] = 1;for(int k = list1[s] ;k ;k = E1[k].next){int to = E1[k].to;if(!mark[to]) DFS1(to);}st.push(s); }void DFS2(int s) {mark[s] = 1;Belong[s] = cont;for(int k = list2[s] ;k ;k = E2[k].next){int to = E2[k].to;if(!mark[to]) DFS2(to);} }int main () {int n ,i ,j ,a ,nn;while(~scanf("%d" ,&n)){memset(list1 ,0 ,sizeof(list1));memset(list2 ,0 ,sizeof(list2));tot = 1;for(i = 1 ;i <= n ;i ++){scanf("%d" ,&nn);for(j = 1 ;j <= nn ;j ++){scanf("%d" ,&a);add(i ,a + n);}}for(i = 1 ;i <= n ;i ++){scanf("%d" ,&a);add(a + n ,i);}memset(mark ,0 ,sizeof(mark));while(!st.empty()) st.pop();for(i = 1 ;i <= n + n ;i ++){if(!mark[i]) DFS1(i);}memset(mark ,0 ,sizeof(mark));cont = 0;while(!st.empty()){int to = st.top();st.pop(); if(!mark[to]){cont ++;DFS2(to);}} for(i = 1 ;i <= n ;i ++){int tt = 0;for(int k = list1[i] ;k ;k = E1[k].next){int to = E1[k].to;if(Belong[i] == Belong[to])ans[++tt] = to - n;}sort(ans + 1 ,ans + tt + 1);printf("%d" ,tt);for(j = 1 ;j <= tt ;j ++)printf(" %d" ,ans[j]);puts("");}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的POJ1904 强联通(最大匹配可能性)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。