POJ 2135 - Farm Tour 无向图的最小费用最大流加边时注意..要分两次加.不能一次完成..
2013-09-04 20:06
387 查看
题意:
有一个无向图..农夫从1号点出发..要到达N号点..然后回到1号点..来回不能走相同的路径..问最短的距离是多少...
题解:
超级源点向1号点做边..容量为2...n号点向超级汇点做边..容量为2...然后就是根据给的边给两个点做边..注意的是最小费用最大流在做无向图边时不像最大流时那样.直接把那容量为0的反向边容量改成相同的..而是要扎扎实实的加两次..因为费用这个变量的存在...
Program:
有一个无向图..农夫从1号点出发..要到达N号点..然后回到1号点..来回不能走相同的路径..问最短的距离是多少...
题解:
超级源点向1号点做边..容量为2...n号点向超级汇点做边..容量为2...然后就是根据给的边给两个点做边..注意的是最小费用最大流在做无向图边时不像最大流时那样.直接把那容量为0的反向边容量改成相同的..而是要扎扎实实的加两次..因为费用这个变量的存在...
Program:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<math.h> #include<queue> #define MAXN 1080005 #define MAXM 8000005 #define oo 1000000007 #define ll long long using namespace std; struct MCMF { struct node { int x,y,c,v,next; }line[MAXM]; int Lnum,_next[MAXN],pre[MAXN],dis[MAXN],flow,cost; bool inqueue[MAXN]; void initial(int n) { Lnum=-1; for (int i=0;i<=n;i++) _next[i]=-1; } void addline(int x,int y,int c,int v) { line[++Lnum].next=_next[x],_next[x]=Lnum; line[Lnum].x=x,line[Lnum].y=y,line[Lnum].c=c,line[Lnum].v=v; line[++Lnum].next=_next[y],_next[y]=Lnum; line[Lnum].x=y,line[Lnum].y=x,line[Lnum].c=0,line[Lnum].v=-v; } bool SPFA(int s,int e) { int x,k,y; queue<int> Q; while (!Q.empty()) Q.pop(); memset(dis,0x7f,sizeof(dis)); memset(inqueue,false,sizeof(inqueue)); Q.push(s); dis[s]=0,pre[s]=-1; while (!Q.empty()) { x=Q.front(),Q.pop(),inqueue[x]=false; for (k=_next[x];k!=-1;k=line[k].next) if (line[k].c) { y=line[k].y; if (dis[y]>dis[x]+line[k].v) { dis[y]=dis[x]+line[k].v; pre[y]=k; if (!inqueue[y]) { inqueue[y]=true; Q.push(y); } } } } if (dis[e]>oo) return false; flow=oo,cost=0; for (k=pre[e];k!=-1;k=pre[line[k].x]) flow=min(flow,line[k].c),cost+=line[k].v; cost*=flow; for (k=pre[e];k!=-1;k=pre[line[k].x]) line[k].c-=flow,line[k^1].c+=flow; return true; } void MinCostMaxFlow(int s,int e,int &Aflow,int &Acost) { Aflow=0,Acost=0; while (SPFA(s,e)) { Aflow+=flow; Acost+=cost; } } }T; int main() { int n,m,i,s,e,x,y,d,Af,Ac; while (~scanf("%d%d",&n,&m)) { s=0,e=n+1,T.initial(e); T.addline(s,1,2,0),T.addline(n,e,2,0); while (m--) { scanf("%d%d%d",&x,&y,&d); T.addline(x,y,1,d),T.addline(y,x,1,d); } T.MinCostMaxFlow(s,e,Af,Ac); printf("%d\n",Ac); } return 0; }
相关文章推荐
- poj 2135 Farm Tour--最小费用最大流--邻接表--构图的时候注意退边--以及退边的算法
- POJ 2135--Farm Tour【最小费用最大流 && 常规题】
- poj--2135--Farm Tour(最小费用最大流)
- POJ 2135 Farm Tour (最小费用最大流)
- POJ 2135 Farm Tour (网络流,最小费用最大流)
- POJ 2135 Farm Tour (最小费用最大流)
- poj--2135--Farm Tour(最小费用最大流)
- poj_2135 Farm Tour(最小费用最大流)
- POJ 2135 Farm Tour (最小费用最大流模版)
- POJ 2135 Farm Tour 最小费用最大流 -
- poj 2135 Farm Tour(最小费用最大流)
- 最小费用最大流模板(POJ 2135-Farm Tour)
- poj 2135 Farm Tour 【无向图最小费用最大流】
- POJ 2135 Farm Tour [最小费用最大流]
- POJ 2135 Farm Tour(最小费用最大流 模板题)
- 【POJ】2135 Farm Tour 最小费用最大流
- 网络流(最小费用最大流):POJ 2135 Farm Tour
- poj 2135 Farm Tour 【最小费用最大流】
- poj 2135 Farm Tour(最小费用最大流)
- POJ 2135 Farm Tour (最小费用最大流)