POJ2135:Farm Tour

题意:给定一个无向图,从1走到n再从n走回1,每个边只能走一遍,求最短路

题解:可以定义一个源点s,和一个汇点t

s和1相连容量为2,费用为0,

t和n相连容量为2,费用为0

然后所用的边的容量都定为1,跑一遍最小费用最大流即可

  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<queue>
  6 #include<vector>
  7 #define MAXN 1000+10
  8 #define INF 0x7f7f7f7f
  9 #define ll long long
 10 using namespace std;
 11 struct Edge{
 12     int from,to,cap,flow,cost;
 13     Edge(int u=0,int v=0,int c=0,int f=0,int w=0){
 14         from=u,to=v,cap=c,flow=f,cost=w;
 15     }
 16 };
 17 int n,m;
 18 vector<Edge> edges;
 19 vector<int> G[MAXN];
 20 int d[MAXN];
 21 int b[MAXN];
 22 int a[MAXN];
 23 int p[MAXN];
 24 void AddEdge(int u,int v,int cap,int cost){
 25     edges.push_back(Edge(u,v,cap,0,cost));
 26     edges.push_back(Edge(v,u,0,0,-cost));
 27     int t=edges.size();
 28     G[u].push_back(t-2);
 29     G[v].push_back(t-1);
 30 }
 31 int SPFA(int s,int t,int &flow,ll &cost){
 32     memset(d,0x7f,sizeof(d));
 33     memset(b,0,sizeof(b));
 34 
 35     queue<int> q;
 36     q.push(s);
 37     b[s]=1;
 38     d[s]=0;
 39     a[s]=INF;
 40     p[s]=0;
 41 
 42     while(!q.empty()){
 43         int x=q.front(); q.pop();
 44         b[x]=0;
 45         for(int i=0;i<G[x].size();i++){
 46             Edge& e=edges[G[x][i]];
 47             if(e.cap>e.flow&&d[e.to]>d[x]+e.cost){
 48                 d[e.to]=d[x]+e.cost;
 49                 a[e.to]=min(a[x],e.cap-e.flow);
 50                 p[e.to]=G[x][i];
 51                 if(!b[e.to]){
 52                     b[e.to]=1;
 53                     q.push(e.to);
 54                 }
 55             }
 56         }
 57     }
 58     if(d[t]==INF){
 59         return 0;
 60     }    
 61 
 62     flow+=a[t];
 63     cost+=1LL*a[t]*d[t];
 64     for(int x=t;x!=s;x=edges[p[x]].from){
 65         edges[p[x]].flow+=a[t];
 66         edges[p[x]^1].flow-=a[t];
 67     }
 68     return 1;
 69 }
 70 ll MincostMaxflow(int s,int t){
 71     int flow=0;
 72     ll cost=0;
 73     while(SPFA(s,t,flow,cost));
 74     return cost;
 75 }
 76 void solve(){
 77     printf("%lld
",MincostMaxflow(1,n+2));
 78 }
 79 void init(){
 80     memset(a,0,sizeof(a));
 81     memset(p,0,sizeof(p));
 82     edges.clear();
 83     for(int i=0;i<=n;i++){
 84         G[i].clear();
 85     }    
 86     for(int i=1;i<=m;i++){
 87         int u,v,w;scanf("%d%d%d",&u,&v,&w);
 88         u++,v++;
 89         AddEdge(u,v,1,w);
 90         AddEdge(v,u,1,w);
 91     }
 92     AddEdge(1,2,2,0);
 93     AddEdge(n+1,n+2,2,0);
 94 }
 95 int main()
 96 {
 97     while(~scanf("%d%d",&n,&m)){
 98         init();
 99         solve();
100     }
101     return 0;
102 }
原文地址:https://www.cnblogs.com/w-h-h/p/7836241.html