HDOJ 1150 Machine Schedule解题报告

来源:互联网 发布:创业软件办公平台 编辑:程序博客网 时间:2024/06/05 21:50

               用二分图的最大匹配来求解题目,关于其思想详见:http://blog.csdn.net/xinhanggebuguake/article/details/6668071

//#include<fstream>#include<iostream>using namespace std;const int MAX = 102;bool linkMap[MAX][MAX];int  crossPath[MAX];bool used[MAX];int n, m;bool search(int u){for (int i=1;i<m;i++){if (linkMap[u][i]&&!used[i]){used[i]=1;//保证路径上无重复点出现if (crossPath[i]==-1||search(crossPath[i])){crossPath[i]=u;//①增广路径的取反return true;}}}return false;}int hungary(){int cnt = 0; memset(crossPath, -1, sizeof(crossPath));for(int i= 1; i<n; i++){memset(used,0, sizeof(used));if(search(i)) cnt++;}return cnt;}int main(){//ifstream cin("Machine Schedule.txt");int k;while(cin>>n,n){cin>>m>>k;memset(linkMap,false, sizeof(linkMap));  for(int i =0; i < k; i++) { int v1, v2;    cin>>v1>>v1>>v2;if(v1&&v2)linkMap[v1][v2] = true;  }cout<<hungary()<<endl;}return 0;}

总结与教训:

                   1、关于增广了路径的查找很多时候很纠结为什么这样实现。仔细分析不难发现,link本身就是存储了已有的增广路径,在①处的操作刚好就是取反的过程

原创粉丝点击