題意: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...