UVa 10806 & 费用流+意识流...
题意:
一张无向图,求两条没有重复的从S到T的路径.
SOL:
网络流为什么屌呢..因为网络流的容量,流量,费用能对许许多多的问题进行相应的转化,然后它就非常的屌.
对于这道题呢,不是要没有重复吗?不是一条边只能走一次吗?那么容量上界就是1.不是要有两条吗?那么总流量就是2.不是带权吗?那么加个费用.
WA得惨不忍睹,最后发现边从0开始记异或以后会改变一些非常奇异的边...真是丝帛= =
Code
/*==========================================================================
# Last modified: 2016-03-07 14:07
# Filename: uva10806.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector> #define lowbit(x) (x)&(-x)
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1] #define maxn 1000
#define maxm 100000
#define pi 3.1415926535898
#define _e 2.718281828459
#define INF 1070000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull; template<class T> inline
void read(T& num) {
bool start=false,neg=false;
char c;
num=0;
while((c=getchar())!=EOF) {
if(c=='-') start=neg=true;
else if(c>='0' && c<='9') {
start=true;
num=num*10+c-'0';
} else if(start) break;
}
if(neg) num=-num;
}
/*==================split line==================*/
struct Edge{
int from,to,w,c;
}e[maxm];
int sume,flow,ans,n,m;
int d[maxn],first[maxn],next[maxm],from[maxn];
bool inq[maxn]; void addedge(int x,int y,int cap,int cost){
sume++; e[sume].from=x; e[sume].to=y; e[sume].w=cap; e[sume].c=cost;
next[sume]=first[x]; first[x]=sume;
sume++; e[sume].from=y; e[sume].to=x; e[sume].w=0; e[sume].c=-cost;
next[sume]=first[y]; first[y]=sume;
}
bool spfa(){
queue<int> q;
FORP(i,0,n) d[i]=INF;
memset(inq,false,sizeof(inq));
memset(from,0,sizeof(from));
q.push(0); d[0]=0; inq[0]=true;
while(!q.empty()){
int now=q.front(); q.pop(); inq[now]=false;
for(int i=first[now];i!=-1;i=next[i])
if (e[i].w && d[now]+e[i].c<d[e[i].to]) {
d[e[i].to]=d[now]+e[i].c;
from[e[i].to]=i;
//q.push(e[i].to);
if (!inq[e[i].to]){
inq[e[i].to]=true;
q.push(e[i].to);
}
}
}
if (d[n]==INF) return false;
return true;
}
void mincost(){
int x=INF,i=from[n];
while (i) {
x=min(e[i].w,x); i=from[e[i].from];
}
flow+=x;
i=from[n];
while (i){
e[i].w-=x;
e[i^1].w+=x;
//ans+=(x*e[i].c);
i=from[e[i].from];
}
ans+=d[n]*x;
}
void reset(){
sume=1; flow=0; ans=0;
memset(e,0,sizeof(e));
FORP(i,0,maxn) first[i]=-1;
memset(next,0,sizeof(next));
}
int main(){
while (scanf("%d",&n)!=EOF){
reset();
if (n==0) return 0;
read(m);
FORP(i,1,m) {
int x,y,w; read(x); read(y); read(w);
addedge(x,y,1,w);
addedge(y,x,1,w);
}
addedge(0,1,2,0);
addedge(n,n+1,2,0);
n++;
while (spfa()) mincost();
if (flow<2) printf("Back to jail\n");
else printf("%d\n",ans);
}
}
UVa 10806 & 费用流+意识流...的更多相关文章
- Acme Corporation UVA - 11613 费用流
Code: #include<cstdio> #include<cstring> #include<vector> #include<queue> #i ...
- UVA 10806 Dijkstra, Dijkstra.(费用流)
n个点的无向带权图,求1->n的最短往返路径,不走重复边. 这里涉及到一个知识点:求无向图上s->t的最短路,其实就是费用流. 而求1->n最短往返路径呢?增加源点s,由s到1加弧, ...
- UVa 10806 Dijkstra,Dijkstra(最小费用最大流)
裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...
- uva 10806 Dijkstra, Dijkstra. (最小费最大流)
uva 10806 Dijkstra, Dijkstra. 题目大意:你和你的伙伴想要越狱.你的伙伴先去探路,等你的伙伴到火车站后,他会打电话给你(电话是藏在蛋糕里带进来的),然后你就能够跑去火车站了 ...
- UVa 2197 & 拆点分环费用流
题意: 给你一个带权有向图,选择一些边组成许多没有公共边的环,使每个点都在k个环上,要求代价最小. SOL: 现在已经养成了这种习惯,偏题怪题都往网络流上想... 怎么做这题呢... 对我们看到每个点 ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- 洛谷 1004 dp或最大费用流
思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...
随机推荐
- WPF样式
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winf ...
- phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
转:http://www.cnblogs.com/huangcong/p/3687665.html 首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包 ...
- MongoDB的介绍和使用场景(1)
MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前 NoSQL 数据库产品中最热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB 使用 C++开发.M ...
- poj 1006:Biorhythms(水题,经典题,中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 110991 Accepted: 34541 Des ...
- spring 集成 log4j 配置
在web.xml中增加如下代码: <context-param> <param-name>log4jConfigLocation</param-name> < ...
- scala中的trait
这里的trait字面意思是特质或者特征,这个词翻译成特征比较合适.它的意义和java,c#中接口很类似.但是trait支持部分实现,也就是说可以在scala的trait中可以实现部分方法. 下面我们以 ...
- oracle检查点队列(checkpoint queue)
buffer cache CBC链 按地址链 LRU 干净buffer LRUW 脏buffer 按照冷热 checkpoint queue:链buffer,①链脏块②按buffer第一次脏的时 ...
- 无法启动程序 ”*.lib”
解决办法: 把含有入口函数(main函数)的 工程 如 cpp-test 设置为启动项 具体操作: 选中 cpp-test 工程 右击 —> 设为启动项目
- HDU 3364 Lanterns 高斯消元
Lanterns Problem Description Alice has received a beautiful present from Bob. The present contains ...
- POJ 1741 Tree 树分治
Tree Description Give a tree with n vertices,each edge has a length(positive integer less than 1 ...