| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:为什么最小费用流算法里求最短路时改进过的Dijkstra要比Bellman_Ford要慢呢??In Reply To:为什么最小费用流算法里求最短路时改进过的Dijkstra要比Bellman_Ford要慢呢?? Posted by:Der at 2014-04-26 16:51:37 > #include <iostream>
> #include <cstring>
> #include <cstdio>
> #include <cstdlib>
> #include <cmath>
> #include <string>
> #include <vector>
> #include <list>
> #include <map>
> #include <queue>
> #include <stack>
> #include <bitset>
> #include <algorithm>
> #include <numeric>
> #include <functional>
> #include <set>
> #include <fstream>
>
> using namespace std;
>
> const int maxn=10010;
> const int INF=0x7fffffff;
> int N,M;
> int a[maxn],b[maxn],c[maxn];
> struct edge {
> int to,cap,cost,rev;
> };
> int V;
> vector<edge> G[maxn];
> int dist[maxn];
> int prevv[maxn],preve[maxn];
> /*
> void add_edge(int from,int to,int cap,int cost)
> {
> G[from].push_back((edge){to,cap,cost,(int)G[to].size()});
> G[to].push_back((edge){from,0,-cost,(int)G[from].size()-1});
> }
>
> int min_cost_flow(int s,int t,int f)
> {
> int res=0;
> while (f>0) {
> fill(dist, dist+V, INF);
> dist[s]=0;
> bool update=true;
> while (update) {
> update=false;
> for (int v=0; v<V; v++) {
> if (dist[v]==INF) {
> continue;
> }
> for (int i=0; i<G[v].size(); i++) {
> edge &e=G[v][i];
> if (e.cap>0&&dist[e.to]>dist[v]+e.cost) {
> dist[e.to]=dist[v]+e.cost;
> prevv[e.to]=v;
> preve[e.to]=i;
> update=true;
> }
> }
> }
> }
> if (dist[t]==INF) {
> return -1;
> }
> int d=f;
> for (int v=t; v!=s; v=prevv[v]) {
> d=min(d,G[prevv[v]][preve[v]].cap);
> }
> f-=d;
> res+=d*dist[t];
> for (int v=t; v!=s; v=prevv[v]) {
> edge &e=G[prevv[v]][preve[v]];
> e.cap-=d;
> G[v][e.rev].cap+=d;
> }
> }
> return res;
> }
> */
> int h[maxn];
> typedef pair<int, int> P;
> void add_edge(int from,int to,int cap,int cost)
> {
> G[from].push_back((edge){to,cap,cost,(int)G[to].size()});
> G[to].push_back((edge){from,0,-cost,(int)G[from].size()-1});
> }
>
> int min_cost_flow(int s,int t,int f)
> {
> int res=0;
> fill(h, h+V, 0);
> while (f>0) {
> priority_queue<P,vector<P>,greater<P> > que;
> fill(dist, dist+V, INF);
> dist[s]=0;
> que.push(P(0,s));
> while (!que.empty()) {
> P p=que.top();
> que.pop();
> int v=p.second;
> if (dist[v]<p.first) {
> continue;
> }
> for (int i=0; i<G[v].size(); i++) {
> edge &e=G[v][i];
> if (e.cap>0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]) {
> dist[e.to]=dist[v]+e.cost+h[v]-h[e.to];
> prevv[e.to]=v;
> preve[e.to]=i;
> que.push(P(dist[e.to],e.to));
> }
> }
> }
> if (dist[t]==INF) {
> return -1;
> }
> for (int v=0; v<V; v++) {
> h[v]+=dist[v];
> }
> int d=f;
> for (int v=t; v!=s; v=prevv[v]) {
> d=min(d,G[prevv[v]][preve[v]].cap);
> }
> f-=d;
> res+=d*h[t];
> for (int v=t; v!=s; v=prevv[v]) {
> edge &e=G[prevv[v]][preve[v]];
> e.cap-=d;
> G[v][e.rev].cap+=d;
> }
> }
> return res;
> }
>
> int main()
> {
> //freopen("/Users/apple/Desktop/2135/2135/in", "r", stdin);
> //freopen("/Users/apple/Desktop/2135/2135/out", "w", stdout);
> while ((scanf("%d%d",&N,&M))!=EOF) {
> V=N;
> for (int i=0; i<M; i++) {
> scanf("%d%d%d",&a[i],&b[i],&c[i]);
> }
> int s=0,t=N-1;
> for (int i=0; i<M; i++) {
> add_edge(a[i]-1, b[i]-1, 1, c[i]);
> add_edge(b[i]-1, a[i]-1, 1, c[i]);
> }
> int res2=min_cost_flow(s, t, 2);
> printf("%d\n",res2);
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator