HDU 3488 Tour(最大二分匹配找最小环权值和)
2017-01-02 15:29
453 查看
和1853一样。
#include<iostream> using namespace std; const int maxn=200+5; char map[maxn][maxn]; int w[maxn][maxn],n; int lx[maxn],ly[maxn]; int Left[maxn]; bool s[maxn],t[maxn]; bool match(int i) { s[i]=true; for(int j=1;j<=n;j++) if(lx[i]+ly[j]==w[i][j]&&!t[j]){ t[j]=true; if(!Left[j]||match(Left[j])){ Left[j]=i; return true; } } return false; } void update() { int a=(1<<30); for(int i=1;i<=n;i++) if(s[i]) for(int j=1;j<=n;j++) if(!t[j]) a=min(a,lx[i]+ly[j]-w[i][j]); for(int i=1;i<=n;i++){ if(s[i]) lx[i]-=a; if(t[i]) ly[i]+=a; } } void KM() { for(int i=1;i<=n;i++){ Left[i]=lx[i]=ly[i]=0; for(int j=1;j<=n;j++) lx[i]=max(lx[i],w[i][j]); } for(int i=1;i<=n;i++){ for(;;) { for(int j=1;j<=n;j++) s[j]=t[j]=0; if(match(i)) break;else update(); } } } int main() { int T; scanf("%d",&T); while(T--) { int m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) w[i][j]=-100000000; } for(int i=0;i<m;i++) { int x,y,d; scanf("%d%d%d",&x,&y,&d); if(x==y) continue; w[x][y]=max(w[x][y],-d); } KM(); int ans=0; for(int i=1;i<=n;i++) ans+=-w[Left[i]][i]; printf("%d\n",ans); } }
相关文章推荐
- hdu 3488 Tour (最小权匹配 / 费用流)
- HDU 3488 Tour 最大权匹配
- Q - Tour - hdu 3488(最小匹配值)
- HDU 3488--Tour(二分图最小完备匹配,KM算法)
- HDU 3488 Tour 最小费用最大流||最大匹配
- HDU 3488 Tour 用费用流解决完美匹配最小费用问题
- hdu 3488 Tour(二分匹配 最小权完备匹配 km算法)
- hdu 3360 National Treasures 最小顶点覆盖(最大匹配)
- HDU 3488 Tour(拆点+最优匹配)
- HDU 1150 Machine Schedule 最小点覆盖数==最大匹配数
- HDU 1150 Machine Schedule(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- HDU 4160 最小路径覆盖 = 顶点数 - 最大匹配数 二分匹配
- hdu 2063 过山车 + hdu 2119 Matrix (二分图的最大匹配边和最小覆盖点)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- HDU 2063 过山车(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- Cyclic Tour hdu 1853 最小费用最最大流
- hdu 1150 二分图 最小点覆盖=最大匹配
- hdu 4160 Dolls--最小点集覆盖=V-二分图最大匹配
- KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home