http://acm.hdu.edu.cn/showproblem.php?pid=3488
依然KM, 可以最小费用流 与HDU1853 差不多,但是1853要判断是否满足回路的的条件,KM还不会判回路,所以做1853时学了最小费用流做的,说是学最小费用流 只是皮毛了。。。
代码(KM):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define Max(a,b)a>b?a:b
#define Min(a,b)a<b?a:b
#define inf 999999
#define MAX 202
using namespace std;
int map[MAX][MAX],lx[MAX],ly[MAX],link[MAX];
bool vx[MAX],vy[MAX];
int n;
struct Node
{int x,y;
};
Node H[MAX],M[MAX];bool dfs(int x)
{int j;vx[x]=1;for(j=1;j<=n;j++){if(!vy[j]&&map[x][j]==lx[x]+ly[j]){vy[j]=1;if(!link[j]||dfs(link[j])){link[j]=x;return 1;}}}return 0;
}
int KM()
{int i,j,k;for(i=1;i<=n;i++){lx[i]=-inf;for(j=1;j<=n;j++)lx[i]=Max(lx[i],map[i][j]);}memset(ly,0,sizeof(ly));memset(link,0,sizeof(link));for(i=1;i<=n;i++){while(1){memset(vx,0,sizeof(vx));memset(vy,0,sizeof(vy));if(dfs(i))break;int MIN=inf;for(j=1;j<=n;j++)if(vx[j])for(k=1;k<=n;k++)if(!vy[k])MIN=Min(MIN,lx[j]+ly[k]-map[j][k]);for(j=1;j<=n;j++)if(vx[j])lx[j]-=MIN;for(j=1;j<=n;j++)if(vy[j])ly[j]+=MIN;}}int ans=0;for(j=1;j<=n;j++)if(link[j])ans+=map[link[j]][j];return ans;
}int main()
{int i,j,fee,m;char ch[MAX];int CASE;scanf("%d",&CASE);while(CASE--){scanf("%d%d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=n;j++)map[i][j]=-inf;while(m--){scanf("%d%d%d",&i,&j,&fee);map[i][j]=Max(map[i][j],-fee);}int ans=-KM();printf("%d\n",ans);}return 0;
}