HDU 1853 Cyclic Tour[有向环最小权值覆盖]
Cyclic Tour
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)
Total Submission(s): 2399 Accepted Submission(s): 1231
The first line of each test case contains two integers N (N ≤ 100) and M, indicating the number of cities and the number of roads. The M lines followed, each of them contains three numbers A, B, and C, indicating that there is a road from city A to city B, whose length is C. (1 ≤ A,B ≤ N, A ≠ B, 1 ≤ C ≤ 1000).
1 2 5
2 3 5
3 1 10
3 4 12
4 1 8
4 6 11
5 4 7
5 6 9
6 5 4
6 5
1 2 1
2 3 1
3 4 1
4 5 1
5 6 1
-1
In the first sample, there are two cycles, (1->2->3->1) and (6->5->4->6) whose length is 20 + 22 = 42.
题意:
给你一个 N 个顶点 M 条边的带权有向图, 要你把该图分成 1 个或多个不相交的有向环. 且所有点都只被一个有向环覆盖.
问你该有向环所有权值的总和最小是多少?(保证有解)
解析:
任意类似的【有向环最小权值覆盖】问题,都可以用最小费用流来写。
由于题目中要求每个点最多走一次,为了防止走多次的发生,我们要把每个点 i 拆成左部点i和右部点i+n两个点。
具体建图如下:
1、S向各点连<1,0>(前者表示容量,后者表示花费)
2、各点向T连<1,0>
3、如果i与j之间有连边,i向j+n连<1,w[i,j]>
最终如果最大流 == n 的话(即满流),那么最小费用就是我们所求,否则输出-1;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int N=;
const int M=2e5+;
const int inf=0x3f3f3f3f;
struct edge{int v,cap,cost,next;}e[M<<];int tot=,head[N];
int n,m,cas,ans,res,S,T,dis[N],Prev[N],flow[N],q[N*];
bool vis[N];
void add(int x,int y,int z,int cost){
e[++tot].v=y;e[tot].cap=z;e[tot].cost=cost;e[tot].next=head[x];head[x]=tot;
e[++tot].v=x;e[tot].cap=;e[tot].cost=-cost;e[tot].next=head[y];head[y]=tot;
}
bool spfa(){
for(int i=S;i<=T;i++) vis[i]=,dis[i]=inf;
int h=,t=;q[t]=S;dis[S]=;flow[S]=inf;
while(h!=t){
int x=q[++h];vis[x]=;
for(int i=head[x];i;i=e[i].next){
if(e[i].cap&&dis[e[i].v]>dis[x]+e[i].cost){
dis[e[i].v]=dis[x]+e[i].cost;
Prev[e[i].v]=i;
flow[e[i].v]=min(flow[x],e[i].cap);
if(!vis[e[i].v]){
vis[e[i].v]=;
if(dis[e[i].v]<dis[x])
q[h--]=e[i].v;
else
q[++t]=e[i].v;
}
}
}
}
return dis[T]!=inf;
}
void augment(){
for(int i=T;i!=S;i=e[Prev[i]^].v){
e[Prev[i]].cap-=flow[T];
e[Prev[i]^].cap+=flow[T];
}
res+=flow[T];
ans+=dis[T]*flow[T];
}
void init(){
res=ans=;tot=;
memset(head,,sizeof head);
}
int main(){
while(scanf("%d%d",&n,&m)==){
init();
S=,T=n<<|;
for(int i=;i<=n;i++) add(S,i,,),add(i+n,T,,);
for(int i=,x,y,w;i<=m;i++) x=read(),y=read(),w=read(),add(x,y+n,,w);;
while(spfa()) augment();
if(res==n) printf("%d\n",ans);
else printf("-1\n");
}
return ;
}
HDU 1853 Cyclic Tour[有向环最小权值覆盖]的更多相关文章
- hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- HDU 3488 Tour(最小费用流:有向环最小权值覆盖)
http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意: 给出n个点和m条边,每条边有距离,把这n个点分成1个或多个环,且每个点只能在一个环中,保证有解. ...
- Tour HDU - 3488 有向环最小权值覆盖 费用流
http://acm.hdu.edu.cn/showproblem.php?pid=3488 给一个无源汇的,带有边权的有向图 让你找出一个最小的哈密顿回路 可以用KM算法写,但是费用流也行 思路 1 ...
- hdu 1853 Cyclic Tour 最大权值匹配 全部点连成环的最小边权和
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) ...
- hdu 1853 Cyclic Tour 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...
- 【刷题】HDU 1853 Cyclic Tour
Problem Description There are N cities in our country, and M one-way roads connecting them. Now Litt ...
- ZOJ-2342 Roads 二分图最小权值覆盖
题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...
- HDU 1853 Cyclic Tour(最小费用最大流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others) Tota ...
- 最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
题目传送门 /* KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法 */ #include <cstdio> #include <cmath> #incl ...
随机推荐
- ABP开发框架前后端开发系列---(1)框架的总体介绍
ABP是ASP.NET Boilerplate的简称,ABP是一个开源且文档友好的应用程序框架.ABP不仅仅是一个框架,它还提供了一个最徍实践的基于领域驱动设计(DDD)的体系结构模型.学习使用ABP ...
- Jenkins连接TFS出现错误:“jenkins com.microsoft.tfs.core.exceptions.TECoreException”的问题收集
没成功解决过,下面提供一些收集的链接地址,因为这个问题真的很少. https://social.msdn.microsoft.com/Forums/vstudio/en-US/1a75a0b2-459 ...
- shell实现自动备份整个数据库,一个库备份一个文件
自动实现备份整个数据库 实现一个库备份一个文件 实现排除不需要备份的库 实现备份成压缩文件 实现定义保留多少天的备份文件 核心代码 #!/bin/bash #set -x ############## ...
- Storyboards Tutorial 04
设计好后运行发现没有任何变化,是空白的.这是因为你的tableview相关的delegate方法还在.所以首先要屏蔽或者删除在PlayerDetailsViewController.m 如下的操作 # ...
- MFC中 创建基于CFormView的文档视图程序
在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...
- MFC中 获取新输入编辑框的内容
//得到原始内容的长度 int len = m_editPoemFileStr.GetLength(); UpdateData(true); //得到新增加的内容 CString sNewStrin ...
- 网络库libevent、libev、libuv对比
Libevent.libev.libuv三个网络库,都是c语言实现的异步事件库Asynchronousevent library). 异步事件库本质上是提供异步事件通知(Asynchronous Ev ...
- Upan
http://www.xiazaijidi.com/ http://www.ushendu.com/
- HDOJ--2112--
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- leetcode第一刷_Word Search
这道题之前一直没敢做,没想到前天用递归一遍过了. . 当时为什么想着用递归,而不是dp呢.由于我想到达某个位置的情况有非常多,即使从当前位置開始的搜索是已知的,但之前的状态是如何的也无从得知啊,实话实 ...