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 }
本文为博主原创文章,转载请注明出处。