HDU1150 Machine Schedule

匈牙利算法

目前为止还是半懂不懂的状态



 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int n,m,k;
 6 int mp[200][200];//邻接矩阵 
 7 int vis[200];//B集中访问标记 
 8 int link1[200];//B集中点i匹配的A中元素 
 9 int pd(int a){
10     int i,j;
11     for(i=0;i<m;i++){
12         if(!vis[i] && mp[a][i]){
13             vis[i]=1;
14             if(link1[i]==-1 || pd(link1[i]))//若B集中i未匹配,或者其匹配的A中元素有其他匹配 
15             {
16                 link1[i]=a;
17                 return 1;
18             }
19         }
20     }
21     return 0;
22 }
23 int main(){
24     while(scanf("%d",&n) &&n!=0){
25         scanf("%d%d",&m,&k);
26         int i,j;
27         int u,v;
28         memset(mp,0,sizeof(mp));
29         for(i=1;i<=k;i++){
30             scanf("%d%d%d",&j,&u,&v);//第一个数据是序号,并没有用 
31             if(u>0&&v>0)mp[u][v]=1;//如果出点或者入点为0,机器初始状态即可解决 
32         }
33         memset(link1,-1,sizeof(link1));
34         int ans=0;
35         for(i=0;i<n;i++){
36             memset(vis,0,sizeof(vis));
37             if(pd(i))ans++; 
38         }
39         printf("%d\n",ans);
40     }
41     return 0;
42 }

 


 

posted @ 2016-05-05 00:17  SilverNebula  阅读(132)  评论(0编辑  收藏  举报
AmazingCounters.com