Cyclic Tour

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)
Total Submission(s): 1399    Accepted Submission(s): 712

Problem Description
There
are N cities in our country, and M one-way roads connecting them. Now
Little Tom wants to make several cyclic tours, which satisfy that, each
cycle contain at least two cities, and each city belongs to one cycle
exactly. Tom wants the total length of all the tours minimum, but he is
too lazy to calculate. Can you help him?
 
Input
There are several test cases in the input. You should process to the end of file (EOF).
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).
 
Output
Output one number for each test case, indicating the minimum length of all the tours. If there are no such tours, output -1.
 
Sample Input
6 9
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
 
Sample Output
42
-1

Hint

In the first sample, there are two cycles, (1->2->3->1) and (6->5->4->6) whose length is 20 + 22 = 42.

 
Author
RoBa@TJU
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  1533 3395 3315 1565 2448

费用流,拆点,source连接每个入点,费用0,容量1,每个出点连sink,费用0,容量1,入点出点见连费用边权,容量1,裸的费用流。

只要注意一下spfa的队列数组开大一点。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 210
#define INF 0x3f3f3f3f
//AC
int n,m;
struct Edge
{
int np,val,c;
Edge *next,*neg;
}E[MAXN*MAXN],*V[MAXN*];
int tope,sour=,sink=;
void add_edge(int x,int y,int z,int c)
{
//cout<<"Add"<<x<<" "<<y<<" "<<z<<" "<<c<<endl;
E[++tope].np=y;
E[tope].val=z;
E[tope].c=c;
E[tope].next=V[x];
V[x]=&E[tope];
E[++tope].np=x;
E[tope].val=;
E[tope].c=-c;
E[tope].next=V[y];
V[y]=&E[tope]; E[tope].neg=&E[tope-];
E[tope-].neg=&E[tope];
}
int q[MAXN*],vis[MAXN],dis[MAXN],dfn=;
int prev[MAXN];
Edge *path[MAXN];
int spfa()
{
int ope=-,clo=,now;
Edge *ne;
memset(dis,INF,sizeof(dis));
dfn++;
q[]=sour;
vis[sour]=dfn;
dis[sour]=;
while (ope<clo)
{
now=q[++ope];
vis[now]=;
for (ne=V[now];ne;ne=ne->next)
{
if (ne->val&&dis[ne->np]>dis[now]+ne->c)
{
dis[ne->np]=dis[now]+ne->c;
prev[ne->np]=now;
path[ne->np]=ne;
if (vis[ne->np]!=dfn)
{
vis[ne->np]=dfn;
q[++clo]=ne->np;
}
}
}
}
return dis[sink];
}
pair<int,int> max_cost_flow()
{
int ds,fl,now,x;
pair<int,int> ret;
ret.first=ret.second=;
while (ds=spfa(),ds!=INF)
{
x=sink;
fl=INF;
while (x!=sour)
{
fl=min(fl,path[x]->val);
x=prev[x];
}
x=sink;
while (x!=sour)
{
path[x]->val-=fl;
path[x]->neg->val+=fl;
x=prev[x];
}
ret.first+=fl;
ret.second+=ds*fl;
}
return ret;
}
int main()
{
freopen("input.txt","r",stdin);
int i,j,k,x,y,z;
while (~scanf("%d%d",&n,&m))
{
tope=-;
memset(V,,sizeof(V));
for (i=;i<n;i++)
{
add_edge(sour,+i,,);
add_edge(+i+n,sink,,);
}
for(i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);x--;y--;
add_edge(+x,+y+n,,z);
}
pair<int,int> p1;
p1=max_cost_flow();
if (p1.first!=n)
{
printf("-1\n");
}else
{
printf("%d\n",p1.second);
}
}
}

Cyclic Tour HDUOJ 费用流的更多相关文章

  1. hdu 1853 Cyclic Tour 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...

  2. poj2135 Farm Tour(费用流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  3. POJ 2135 Farm Tour (费用流)

    [题目链接] http://poj.org/problem?id=2135 [题目大意] 有一张无向图,求从1到n然后又回来的最短路 同一条路只能走一次 [题解] 题目等价于求从1到n的两条路,使得两 ...

  4. [网络流]Farm Tour(费用流

    Farm Tour 题目描述 When FJ's friends visit him on the farm, he likes to show them around. His farm compr ...

  5. hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

  6. HDU 1853 Cyclic Tour(最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others) Tota ...

  7. POJ 2135 Farm Tour [最小费用最大流]

    题意: 有n个点和m条边,让你从1出发到n再从n回到1,不要求所有点都要经过,但是每条边只能走一次.边是无向边. 问最短的行走距离多少. 一开始看这题还没搞费用流,后来搞了搞再回来看,想了想建图不是很 ...

  8. Tour HDU - 3488 有向环最小权值覆盖 费用流

    http://acm.hdu.edu.cn/showproblem.php?pid=3488 给一个无源汇的,带有边权的有向图 让你找出一个最小的哈密顿回路 可以用KM算法写,但是费用流也行 思路 1 ...

  9. POJ 2135 Farm Tour &amp;&amp; HDU 2686 Matrix &amp;&amp; HDU 3376 Matrix Again 费用流求来回最短路

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

随机推荐

  1. Gamma校正及其OpenCV实现

    參考:[1]http://www.cambridgeincolour.com/tutorials/gamma-correction.htm [2]http://en.wikipedia.org/wik ...

  2. lua 基本

    Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下 Lua 的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得怎么写 Lua 程序了. 在 Lua 中,一 ...

  3. 不一样的风格,C#的lambda表达式

    下面贴出代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  4. 怎么在我们的App中集成条码扫描功能?

    现在很多App都有条码扫描功能,有的手机比如某米在照相机中集成了条码扫描功能,但是还有一部分手机没有这样的集成,比如韩国某星,需要自己下载一个条码扫描App.今天我们就来看看怎么在自己的App中集成一 ...

  5. Linux平台的boost安装全解

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  6. burp

    http://www.2cto.com/Article/201406/310929.html

  7. ASP.NET MVC ajax提交 防止CSRF攻击

    //在View中 <script type="text/javascript"> @functions{ public string ToKenHeaderValue( ...

  8. js获取元素transform参数得出的个人理解

    之前写页面的时候有试过想用js获取某些元素的translate的数值什么的,但是translate又是transform的子样式(勉强说说),理所当然就是先获取transform样式,再读里面的值. ...

  9. Using load balance for thrift servers

    Software load balance .Nginx(http://nginx.org) 1.Install nginx download source code from http://ngin ...

  10. Could not parse mapping document from resource cn/spt/model/Student.hbm.xml

    初始hibernate, 写第一个程序 helloworld的错误: Exception in thread "main" org.hibernate.InvalidMapping ...