POJ 2135 最小費用流

2021-09-25 20:21:14 字數 1027 閱讀 5892

可以把每個點都當作乙個節點,去一次再回來一次可以等價為從完全不同(沒有共用邊)的兩條路徑上走過去,所以如果兩點之間有一條路的話,我們就為他新增兩條邊,一條正向一條反向(因為是無向圖,即使只考慮去的情況也要加兩條邊,保證正反都可以走,但是事實上只會走一條邊,因為如果這條邊正反都要走一遍的話,那一定是不走路程最小),容量設為1(只能走一遍),權值設為路的長度,然後從起點s到點1連一條邊,容量為2,再從n節點到終點t連一條邊,容量也為2,然後求最小費用流。

#include#include#include#include #include #include#include #include #include #include#define inf 0x3f3f3f3f

#define n 1010

#define ll long long

using namespace std;int stop;

struct edge

};vectoredges;

vectorg[n];

int n,m,s,t;

void addedge(int from, int to,int cap,int cost)

bool inq[n];

int dis[n],pre[n],a[n];

void init()

edges.clear();

}bool spfa(int &flow,ll &cost)}}

}if(dis[t] == inf)

u = t;

flow += a[t];

cost += dis[t]*a[t];

while (u != s)

return true;

}ll mincost()

int main()

addedge(0,1,2,0);

addedge(n,n+1,2,0);

ll p = mincost();

printf("%lld\n",p);

return 0;

}

poj 2135 最小費用最大流

題意是正向走一次反向走一次,每條路只能走一次,問走最少距離是多少。解題方法 每條路流量為1,費用為距離,建立乙個超級源與超級匯流量為2,費用為0,將超級源連線至點1上,超級匯連線至點n上,這樣求1次最大流就能出來正反兩次走法了,就不用反圖去找了。因為為無向圖,所以每條路建兩次邊,正向一次反向一次。i...

poj 2135 最小費用最大流

題意 給定乙個無向圖,要從1點到n點再返回1點,每條邊最多走一次,問最短需要走多遠。分析 最小費用最大流,把題意看成是要找兩條無交集的從1到n的路線,使距離和最小。圖中的點和邊就是網路流圖中的點和邊。設定乙個源,接到1點,設定乙個匯,從n點接到匯。為保證無交集,我們把每條邊的流量設定為1,而源發出的...

poj 2135 最小費用最大流

思路 把路長看作費用,然後如果u,v之間有邊,就連u v,v u,邊容量為1,表示每條邊只能走一次,最後就是源點與1連邊,容量為2,費用為0,n與匯點連邊,容量為2,費用為0,表示增廣2次。這樣就轉化為為最小費用最大流問題來求解了。1 include2 include3 include4 inclu...