13 30 11 22 0 Sample Output1 Source2009 Asia Wuhan Regional Contest Online題目大意:
給你一張有向圖,問(wèn)你最少刪除的邊數(shù)使得圖中沒(méi)有奇數(shù)環(huán),即環(huán)的點(diǎn)數(shù)為奇數(shù)(1除外)
題目思路:
首先我們看看二分圖的定義:無(wú)向圖G=<V,E>為二分圖的充要條件是G的所有回路的長(zhǎng)度均為偶數(shù)。
所以我們可以利用二分圖的性質(zhì)來(lái)做這題,首先我們可以利用二進(jìn)制的來(lái)枚舉他的所有二分圖的組合,二進(jìn)制中1和0分別屬于不同的集合,然后我們?cè)诿杜e同一集合當(dāng)中的點(diǎn)是否存在邊,如果存在邊就刪掉該邊,然后在記錄刪除的次數(shù),最后取個(gè)最小值就是我們要求的答案
AC代碼:
#include<cstring>#include<cstdio>#define min(x,y) (x<y?x:y)int mp[20][20];int n,m;int sove(int k){ int num=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if((1&(k>>i))==(1&(k>>j))&&mp[i][j])num+=mp[i][j]; //枚舉所有同一集合的點(diǎn)的組合看是否有邊 } } return num;}int main(){ int t;scanf("%d",&t); while(t--){ memset(mp,0,sizeof(mp)); scanf("%d%d",&n,&m); while(m--){ int u,v;scanf("%d%d",&u,&v); mp[u][v]++,mp[v][u]++; //記錄邊出現(xiàn)的次數(shù) } int ans = 1e8; for(int i=1;i<(1<<n);i++){ //枚舉所有狀態(tài) ans=min(ans,sove(i)); //取所有狀態(tài)的最小值 } if(ans==1e8)ans=0; printf("%d/n",ans); } return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注