POJ 2135 Farm Tour 最小費用流

2021-07-03 22:40:48 字數 1574 閱讀 9828

題意:n個點,m條邊,從1號點出發到n號點,再走回來,且不能走走過的路,求最小路徑權和

最小費用流,用流量為1 限制每條邊只能走一次,建立超源匯點,源點連1號點的流量為2,費用0,匯點同理。其他邊的流量為1,費用為權值。

建立超源匯點且權值為2目的是因為起終點經過2次(雖然這裡是點經過2次而題目是邊),而如果不建超源點的話沒辦法表示,如果是直接把跟1號點相連的都設定為2,則很多邊都可以走2次了,不科學了。

建立a->b的邊時建反向弧,也建立b->a的邊,這樣當一去一回的情況下流量就為0了

下面模板是kuangbin的,模板**好

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

#define eps 10^(-6)

#define q_cin ios::sync_with_stdio(false)

#define rep( i , n ) for ( int i = 0 ; i < n ; ++ i )

#define for( i , a , b ) for ( int i = a ; i <= b ; ++ i )

#define clr( a , x ) memset ( a , x , sizeof (a) )

#define re freopen("1.in","r",stdin);

#define we freopen("1.out","w",stdout);

#define mod 10009

#define nmax 10002

//模板**好

const int inf = 0x3f3f3f3f;

const int maxn = 1005;

const int maxm = 10000 * 2 + 10;

struct edge edge[maxm * 2];

int head[maxn], tol;

int pre[maxn], dis[maxn];

bool vis[maxn];

void init()

void addedge(int u, int v, int cap, int cost)

bool spfa(int s, int t) }}

}return pre[t] != -1;

}//返回最大流,cost存最小費用

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 main()

int cost;

mincostmaxflow(ss, tt, cost);

printf("%d\n",cost);

}return 0;

}

POJ 2135 Farm Tour 最小費用流

若不是看了題目分類,很難想到這題和網路流掛上鉤,乍一看是求2遍最短路,但是很明顯求最短路可能是錯誤的。題意 fj 又是他 想帶朋友參觀自己的農場,農場有n個點,m條邊,要從1點到n點,再從n點走回來,且2次不能走相同的路,問最小的花費時間。題解 費用流,最小費用即為答案 我的構圖方法 定義源點和匯點...

poj2135Farm Tour 最小費用最大流

題目要求從1到n走一遍再從n到1走一遍而且有重邊,相當於從1到n走兩邊 所以加乙個源點0 1,費用為0,流量為2 加乙個匯點n 1 n,費用為0,流量為2 中間的邊流量為1 只走一遍 費用為c 然後一遍0 n 1的費用流 要注意是無向圖,所以乙個輸入有4條邊 a b c,1 b a c,0 b a ...

POJ 2135 Farm Tour 最小費用流

很容易看出來時最小費用流,但這裡要注意是無向邊,所以要建立兩條邊。為了滿足退流時,花費還是最小,反向邊的花費要為相反數。1 status g ac 32ms 980kb 2 include3 include4 include 5 include6 include7 include 8 include...