国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

二分圖匹配實例代碼及整理

2020-01-26 13:59:52
字體:
供稿:網(wǎng)友

二分圖匹配實例代碼及整理

1、匈牙利算法

HDU 1150

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int m,n,k; int vis[105]; int mpt[105][105]; int use[105]; int hungary(int x) {   for(int i=1;i<m;i++)   {     if(vis[i]==0&&mpt[x][i]==1)     {       vis[i]=1;       if(use[i]==-1||hungary(use[i]))       {         use[i]=x;         return 1;       }     }   }   return 0; } int main() {   while(scanf("%d",&n)!=EOF,n)   {     scanf("%d%d",&m,&k);     int a,b,c;     memset(mpt,0,sizeof(mpt));     for(int i=1;i<=k;i++)     {       scanf("%d%d%d",&c,&a,&b);       mpt[a][b]=1;     }     int ans=0;     memset(use,-1,sizeof(use));     for(int i=1;i<n;i++)     {       if(hungary(i))       {         ans++;       }       memset(vis,0,sizeof(vis));     }     printf("%d/n",ans);   }   return 0; } 


2、KM算法

HDU 2255

看了很多資料都還不是很懂、、先貼別人的模板

#include<iostream> #include<cstdio> #include<cstring> #include<climits> #include<algorithm> using namespace std; #define N 310 int map[N][N]; bool visitx[N], visity[N]; int lx[N], ly[N]; int match[N]; int n;  bool Hungary(int u) //匈牙利算法 {   visitx[u] = true;   for(int i = 0; i < n; ++i)   {     if(!visity[i] && lx[u] + ly[i] == map[u][i])     {       visity[i] = true;       if(match[i] == -1 || Hungary(match[i]))       {         match[i] = u;         return true;       }     }   }   return false; }  void KM_perfect_match() {   int temp;   memset(lx, 0, sizeof(lx)); //初始化頂標(biāo)   memset(ly, 0, sizeof(ly)); //ly[i]為0   for(int i = 0; i < n; ++i) //lx[i]為權(quán)值最大的邊     for(int j = 0; j < n; ++j)       lx[i] = max(lx[i], map[i][j]);   for(int i = 0; i < n; ++i) //對n個點匹配   {     while(1)     {       memset(visitx, false, sizeof(visitx));       memset(visity, false, sizeof(visity));       if(Hungary(i)) //匹配成功         break;       else //匹配失敗,找最小值       {         temp = INT_MAX;         for(int j = 0; j < n; ++j) //x在交錯樹中           if(visitx[j])             for(int k = 0; k < n; ++k) //y在交錯樹外               if(!visity[k] && temp > lx[j] + ly[k] - map[j][k])                 temp = lx[j] + ly[k] - map[j][k];         for(int j = 0; j < n; ++j) //更新頂標(biāo)         {           if(visitx[j])             lx[j] -= temp;           if(visity[j])             ly[j] += temp;         }       }     }   } }  int main() {   int ans;   while(scanf("%d", &n) != EOF)   {     ans = 0;     memset(match, -1, sizeof(match));     for(int i = 0; i < n; ++i)       for(int j = 0; j < n; ++j)         scanf("%d", &map[i][j]);     KM_perfect_match();     for(int i = 0; i < n; ++i) //權(quán)值相加       ans += map[match[i]][i];     printf("%d/n", ans);   }   return 0; } 

3、多重匹配

HDU  3605 Escape

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n,m; int num[15]; int mpt[100005][15]; int vis[15]; int use[15]; int dp[15][100005]; int hungary(int x) {   for(int i=1;i<=m;i++)   {     if(vis[i]==0&&mpt[x][i]==1)     {       vis[i]=1;       if(use[i]<num[i])//滿足條件       {         dp[i][use[i]++]=x;         return 1;       }       //不滿足則尋找增廣路       for(int j=0;j<use[i];j++)//看能否回溯一個出去       {         if(hungary(dp[i][j]))         {           dp[i][j]=x;           return 1;         }       }     }   }   return 0; } int main() {   while(scanf("%d%d",&n,&m)!=EOF)   {     for(int i=1;i<=n;i++)     {       for(int j=1;j<=m;j++)       {         scanf("%d",&mpt[i][j]);       }     }     for(int i=1;i<=m;i++)       scanf("%d",&num[i]);     int ans=0;     memset(use,0,sizeof(use));     for(int i=1;i<=n;i++)     {       memset(vis,0,sizeof(vis));       if(!hungary(i))       {         ans=1;         break;       }     }     if(ans==0)     {       printf("YES/n");     }     else printf("NO/n");   }    return 0; } 

以上就是二分圖匹配的實現(xiàn)代碼,如有疑問請留言,或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 鄂托克前旗| 洮南市| 平塘县| 万源市| 峨眉山市| 海南省| 武城县| 成都市| 井冈山市| 鹤山市| 南昌市| 巴东县| 若尔盖县| 博兴县| 安泽县| 彰化县| 延庆县| 芦溪县| 赤水市| 兴隆县| 鄂托克前旗| 东台市| 拜泉县| 锦屏县| 辽宁省| 岳池县| 砀山县| 舒城县| 奉新县| 浦江县| 天长市| 家居| 宁海县| 建始县| 汶川县| 安平县| 南川市| 普安县| 涿州市| 图木舒克市| 油尖旺区|