hdu 3488 Tour (KM)

来源:互联网 发布:sql 增加列 默认值 编辑:程序博客网 时间:2024/05/17 23:08

跟1853一样的题

 

 

 

#include<stdio.h>#include<string.h>#define N 210#define inf 0x3fffffffint map[N][N],lx[N],ly[N],match[N],n;bool sx[N],sy[N];bool find(int u){sx[u]=true;for(int j=1;j<=n;j++){if(!sy[j]&&lx[u]+ly[j]==map[u][j]){sy[j]=true;if(match[j]==-1||find(match[j])){match[j]=u;return true;}}}return false;}int KM(){int i,j,k,d;memset(ly,0,sizeof(ly));for(i=1;i<=n;i++){lx[i]=map[i][1];for(j=2;j<=n;j++)if(lx[i]<map[i][j])lx[i]=map[i][j];}memset(match,-1,sizeof(match));for(i=1;i<=n;i++){while(1){memset(sx,false,sizeof(sx));memset(sy,false,sizeof(sy));if(find(i))break;d=inf;for(j=1;j<=n;j++){if(!sx[j])continue;for(k=1;k<=n;k++){if(sy[k])continue;if(d>lx[j]+ly[k]-map[j][k])d=lx[j]+ly[k]-map[j][k];}}if(d==inf)return 1;for(j=1;j<=n;j++){if(sx[j])lx[j]-=d;if(sy[j])ly[j]+=d;}}}int sum=0;for(i=1;i<=n;i++){if(map[match[i]][i]==-inf)return 1;sum+=map[match[i]][i];}return sum;}int main(){int i,j,m,t,x,y,a;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);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",&x,&y,&a);if(-a>map[x][y])map[x][y]=-a;}printf("%d\n",-KM());}return 0;}

 

 

 

 

原创粉丝点击