題目大意:給定一張無向圖,可能有重邊,n個城市,m條路,問乙個人從1到n再回到1並且不能走過痛一條路兩次,問最小費用是多少;
題目解析:構圖,源(容量為2,費用為0)->城市(容量為一,費用為cost)->匯(容量為2,費用為1);
ac**:
#include#include#include#include#include#includeusing namespace std;
const int maxn = 1010;
const int maxm = 100000;
const int inf = 0x3fffffff;
struct edge
edge[maxm];
int head[maxm],tol;
int pre[maxm],dis[maxm];
bool vis[maxm];
int start, end;
void init()
void addedge(int u,int v,int cap,int cost)
bool spfa(int s,int t)
dis[s] = 0;
vis[s] = true;
q.push(s);
while(!q.empty())
} }
} if(pre[t] == -1)
else
return true;
} int mincostmaxflow(int s,int t,int &cost)
for(int i = pre[t]; i != -1; i = pre[edge[i^1].to])
flow += min;
} return flow;
} int n,m;
int graph[maxn][maxn];
int main()
start=0;
end=n+1;
addedge(0,1,2,0);
addedge(n,n+1,2,0);
int ans;
int t=mincostmaxflow(0,n+1,ans);
printf("%d\n",ans);
} 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...