hdu 1853

来源:互联网 发布:企业数据集成 编辑:程序博客网 时间:2024/05/22 06:54
#include<stdio.h>#include<string.h>#define inf 999999999#define N 200int map[N][N],mark[N],lx[N],ly[N],link[N],s[N],n;int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int find(int k){int i;s[k]=1;for(i=1;i<=n;i++){if(!mark[i]&&lx[k]+ly[i]==map[k][i]){mark[i]=1;if(!link[i]||find(link[i])){link[i]=k;return 1;}}}return 0;}int km(){int i,j,k,a,ans;memset(ly,0,sizeof(ly));for(i=1;i<=n;i++){lx[i]=map[i][1];for(j=2;j<=n;j++)  lx[i]=max(lx[i],map[i][j]);}memset(link,0,sizeof(link));for(i=1;i<=n;i++){while(1){a=inf;  memset(s,0,sizeof(s));  memset(mark,0,sizeof(mark));if(find(i))break;else{for(j=1;j<=n;j++){if(s[j]){for(k=1;k<=n;k++)  if(!mark[k])  a=min(a,lx[j]+ly[k]-map[j][k]);}}if(a==inf)return 1; for(j=1;j<=n;j++) { if(s[j])lx[j]-=a; if(mark[j])ly[j]+=a; }}}}ans=0;for(i=1;i<=n;i++){if(map[link[i]][i]==-inf)//这里注意return 1;elseans=ans+map[link[i]][i];}return ans;}int main(){int i,j,m,a,b,c;while(scanf("%d%d",&n,&m)!=EOF){for(i=1;i<=n;i++)for(j=1;j<=n;j++)   map[i][j]=-inf;for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);if(-c>map[a][b])map[a][b]=-c;}printf("%d\n",-km());}return 0;}//如果存在完美匹配的话,每个点有进有出,自然存在环。

0 0
原创粉丝点击