poj 2135 Farm Tour

来源:互联网 发布:二级计算机c语言 编辑:程序博客网 时间:2024/05/16 06:48

类型:最小费用最大流【经典】

题目:已知有n个点,m条有各自长度的路。fj要带他的朋友从1点走到n点,再从n点返回1点,要求不走重复的点。求往返所走路径长度的最小值是多少

思路:本题相当于求从源点到终点的两条路径,边各不相同,路径长度最小

设每个边的容量为1,构造一个容量网络,则本题即是求从源点到终点流量为2的最少花费【即路径长度】,构造超级源点,指向源点,容量为2,费用为0,方便计算

!!!对于无向图,每条边相当于两条独立的有向边

// poj 2135 Farm Tour// 868K16MS#include <cstdio>#include <cstring>#include <iostream>#include <queue>#include <algorithm>using namespace std;#define CLR(a, b) memset(a, b, sizeof(a))const int INF = 0x7f7f7f7f;const int MAXN = 1010;const int MAXM = 40100;struct {    int v, cap, cost, nxt;}edge[MAXM];int n, m, ans, k;int pre[MAXN], dis[MAXN], head[MAXN];bool vis[MAXN];void addedge(int u,int v,int ca,int co) {    edge[k].v = v;    edge[k].cap = ca;    edge[k].cost = co;    edge[k].nxt = head[u];    head[u] = k++;    edge[k].v = u;    edge[k].cap = 0;    edge[k].cost = -co;    edge[k].nxt = head[v];    head[v] = k++;}bool spfa() {    int i;    fill(dis, dis + n + 1, INF);    CLR(vis, false);    dis[0]=0;    queue<int> q;    q.push(0);    vis[0]=true;    while(!q.empty()) {        int u = q.front();        q.pop();        vis[u] = false;        for(i = head[u]; i; i = edge[i].nxt){            int v = edge[i].v;            if(edge[i].cap > 0 && dis[v] > dis[u] + edge[i].cost) {                dis[v] = dis[u] + edge[i].cost;                pre[v] = i;                if(!vis[v]){                    vis[v] = true;                    q.push(v);                }            }        }    }    if(dis[n] == INF)        return false;    return true;}void end(){    int u, p;    for(u = n; u; u = edge[p ^ 1].v){        p = pre[u];        edge[p].cap -= 1;        edge[p ^ 1].cap += 1;        ans += edge[p].cost;    }}int main(){    int a, b, c;    k = 2;    CLR(head, 0);    CLR(vis, false);    scanf("%d %d", &n, &m);    addedge(0, 1, 2, 0);    while(m--) {        scanf("%d %d %d",&a, &b, &c);        addedge(a, b, 1, c);        // !!!        addedge(b, a, 1, c);    }    ans = 0;    while(spfa()) {        end();    }    cout<<ans<<endl;    return 0;}




原创粉丝点击