HDU-1853 Cyclic Tour
2024-08-23 00:20:56
最小权值环覆盖问题:用几个环把所有点覆盖,求所选取的边最小的权值之和。
拆点思想+求最小转求最大+KM算法
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <fstream>
#include <iostream>
#define rep(i, l, r) for(int i=l; i<=r; i++)
#define clr(x, c) memset(x, c, sizeof(x))
#define N 123
#define MAX 1<<30
#define ll long long
using namespace std;
int read()
{
int x=0, f=1; char ch=getchar();
while (ch<'0' || ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
while (ch>='0' && ch<='9') { x=x*10+ch-'0'; ch=getchar(); }
return x*f;
}
int n, m, l[N], st[N], lx[N], ly[N], v[N][N];
bool vx[N], vy[N]; bool Find(int x)
{
vx[x]=1;
rep(y, 1, n) if (!vy[y])
{
int a=lx[x]+ly[y]-v[x][y];
if (!a)
{
vy[y]=1; if (!l[y] || Find(l[y])) { l[y]=x; return true; }
}
else st[y]=min(st[y], a);
}
return false;
} int km()
{
rep(i, 1, n) lx[i]=-MAX; clr(ly, 0); clr(l, 0);
rep(i, 1, n) rep(j, 1, n) if (lx[i]<v[i][j]) lx[i]=v[i][j];
rep(i, 1, n)
{
rep(j, 1, n) st[j]=MAX;
while (1)
{
clr(vx, 0); clr(vy, 0);
if (Find(i)) break; int a=MAX;
rep(j, 1, n) if (!vy[j] && st[j]<a) a=st[j];
rep(j, 1, n) if (vx[j]) lx[j]-=a;
rep(j, 1, n) if (vy[j]) ly[j]+=a; else st[j]-=a;
}
}
int ans=0;
rep(i, 1, n) if (!l[i] || v[l[i]][i]==-MAX) return -1; else ans+=v[l[i]][i];
return -ans;
} int main()
{
while (~scanf("%d%d", &n, &m))
{
rep(i, 1, n) rep(j, 1, n) v[i][j]=MAX;
rep(i, 1, m) { int x=read(), y=read(), z=read(); if (v[x][y]>z) v[x][y]=z; }
rep(i, 1, n) rep(j, 1, n) v[i][j]*=-1;
printf("%d\n", km());
}
return 0;
}
最新文章
- 基于Caffe的DeepID2实现(上)
- C#多线程之基础篇1
- Code Review 五问五答
- EXCL poi导入
- Robot Motion 分类: POJ 2015-06-29 13:45 11人阅读 评论(0) 收藏
- .NET判断某一年的所有放假的日期
- 函数buf_read_page
- x86、i386、i486、i586、i686和x86_64
- 终极二分查找--传说十个人写九个有bug
- [Head First Python]5. 推导数据:处理数据
- Task的异步模式
- #pragma mark指令的作用
- 阿里云 RDS for MySQL支持什么引擎
- excel 用VBA将所有单元格内容全部转换为文本
- HTML5 学习01——浏览器问题、新元素
- maybe i have no answer
- Python配置tab自动补全功能
- llvm code call graph
- python 之 python3内置函数
- CF245H Queries for Number of Palindromes