POJ3068 "Shortest" pair of paths最小費用流

        將相連的倉庫i,j連邊,並設其容量爲1,花費爲c,如果同一對倉庫間有多條連邊,不應該合併,所以這裏只用鄰接表存邊,不用鄰接矩陣,最終即求流量爲2的最小費用流即可。

#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
#include <queue>
#include <list>
#include <algorithm>
#include <stack>
#include <map>
#include <time.h>
using namespace std;

#define MAXN 70
#define MAXCOST 100000000
struct Edge
{
	int to, cost, cap ,rec;
};
vector<Edge> G[MAXN];

int D[MAXN];
int Prev[MAXN];
int Pree[MAXN];

void AddEdge(int from, int to, int cost, int cap)
{
	Edge edge1, edge2;
	edge1.to = to;
	edge1.cap = cap;
	edge1.cost = cost;
	edge1.rec = G[to].size();
	G[from].push_back(edge1);
	edge2.to = from;
	edge2.cost = -cost;
	edge2.cap = 0;
	edge2.rec = G[from].size() - 1;
	G[to].push_back(edge2);
}

int Min_Cost_Flow(int s, int t, int f, int n)
{
	bool bUpdate = false;
	int res = 0;
	while (f > 0)
	{
		for (int i = 0; i < n;i++)
		{
			D[i] = MAXCOST;
		}
		bUpdate = true;
		D[s] = 0;
		while (bUpdate)
		{
			bUpdate = false;
			for (int v = 0; v < n; v++)
			{
				if (D[v] >= MAXCOST)
				{
					continue;
				}
				for (int i = 0; i < G[v].size(); i++)
				{
					if (G[v][i].cap > 0 && D[v] + G[v][i].cost < D[G[v][i].to])
					{
						bUpdate = true;
						D[G[v][i].to] = D[v] + G[v][i].cost;
						Prev[G[v][i].to] = v;
						Pree[G[v][i].to] = i;
					}
				}
			}
			
		}
		if (D[t] >= MAXCOST)
		{
			return -1;
		}
		int d = f;
		for (int tt = t; tt != s;tt = Prev[tt])
		{
			d = min(G[Prev[tt]][Pree[tt]].cap, d);
		}
		f -= d;
		res += d * D[t];
		for (int tt = t; tt != s; tt = Prev[tt])
		{
			Edge& edge = G[Prev[tt]][Pree[tt]];
			edge.cap -= d;
			G[edge.to][edge.rec].cap += d;
		}
	}
	return res;
}

void ClearEdge()
{
	for (int i = 0; i < MAXN;i++)
	{
		G[i].clear();
	}
}

int main()
{
#ifdef _DEBUG
	freopen("e:\\in.txt", "r", stdin);
#endif
	int n, m;
	int testcount = 0;
	while (scanf("%d %d", &n, &m) != EOF)
	{
		if (n == 0 && m == 0)
		{
			break;
		}
		testcount++;
		for (int i = 0; i < m;i++)
		{
			int from, to, cost;
			scanf("%d %d %d", &from, &to, &cost);
			AddEdge(from, to, cost, 1);
		}
		printf("Instance #%d: ", testcount);
		int ans = Min_Cost_Flow(0, n - 1, 2, n);
		if (ans == -1)
		{
			printf("Not possible\n");
		}
		else
			printf("%d\n", ans);
		ClearEdge();
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章