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);
	}
}
时间: 2024-10-27 19:31:57

UVa 10806 & 费用流+意识流...的相关文章

Acme Corporation UVA - 11613 费用流

Code: #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<algorithm> using namespace std; const int maxn=500; const int INF=10000000+23666; typedef long long ll; int s,t,n; struct Edge{ int from,to,co

UVA 10746 Crime Wave – The Sequel(费用流)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1687 ProblemG CrimeWave – The Sequel Input: StandardInput Output: StandardOutput TimeLimit: 2 Seconds n bankshave been robbed this fine day. m (grea

UVa 12534 Binary Matrix 2 zkw费用流模版题

题目链接:点击打开链接 思路: 我们首先假设这个图都是全0的 用n个点代表行,m个点代表列 用源点向行连一个值x 表示每行1的个数,向列连一个y表示每列y个1 则若行i和列j之间流过一个流量就表示 (i,j) 点填了1 那么若原来图中(i,j)点为0 则花费就是1 若原图中(i,j)点是1,则花费是-1 如此枚举x跑个费用流就好了 ==居然把我多年的白书费用流坑掉了... zkw走起啊 #include <stdio.h> #include <string.h> #include

uva 10806 Dijkstra, Dijkstra. (最小费最大流)

uva 10806 Dijkstra, Dijkstra. 题目大意:你和你的伙伴想要越狱.你的伙伴先去探路,等你的伙伴到火车站后,他会打电话给你(电话是藏在蛋糕里带进来的),然后你就能够跑去火车站了,那里有人接应你. 可是.由于你的伙伴跑去火车站的时候穿的是囚服,所以,他经过的街道都被戒严了,你必须从其它街道跑过去. 假设你能够到达火车站,请输出你和你的伙伴在路上花费的最短时间,假设不能请"Back to jail". 解题思路:最小费最大流.设置一个超级源点连向监狱(起点1), 容

UVa 2197 &amp; 拆点分环费用流

题意: 给你一个带权有向图,选择一些边组成许多没有公共边的环,使每个点都在k个环上,要求代价最小. SOL: 现在已经养成了这种习惯,偏题怪题都往网络流上想... 怎么做这题呢... 对我们看到每个点都在k个环上,而且没有公共边,那么很显然每个点的入度出度都为k.   然后我们拆点,建源汇ST,S与每个入点连边容量为k,出点与汇点相连容量为k,费用为0,如果城市i,j之间有边那么将i的入点和j的出点连一条费用为权,容量为1的边.然后跑一遍费用流.如果每条边都满流那么就有解. 好神奇...从环变成

UVa 10806 Dijkstra, Dijkstra (最小费用流)

Dijkstra, Dijkstra Dexter: “You don’t understand. I can’t walk... they’ve tied my shoelaces together.” Topper Harley: “A knot. Bastards!” Jim Abrahams and Pat Proft, "Hot Shots! Part Deu Description you are a political prisoner in jail. Things are lo

【网络流24题】No.19 负载平衡问题 (费用流)

[题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input.txt517 9 14 16 4 输出文件示例output.txt11 [分析] 其实我觉得这题可以贪心啊..n^2贪心??.没细想.. 打的是费用流.. 大概这样建图: 懒得写了..凌乱之美.. 求满流费用.. 1 #include<cstdio> 2 #include<cstdlib&

POJ 3422 kaka&#39;s matrix trvals(费用流)

#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <cma

hdu 2448 Mining Station on the Sea【网络费用流】

Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2371    Accepted Submission(s): 732 Problem Description The ocean is a treasure house of resources and the development