UVA 1658(網路流經典拆點方法)

2021-07-05 05:28:57 字數 1649 閱讀 9564

把每個點(除了1,n)之外拆成i和i1,兩點間連一條容量為1,費用為零的邊,這樣可以限定,每個點只被跑到一次,那麼之後跑乙個最流量為2的最小費用流就可以了。

至於其他邊,流量設為1,保證每個邊只被跑到一次。

//#pragma comment(linker, "/stack:1024000000,1024000000")

#include #include #include #include #include #include #include #include #include #include #include #include #include #define all(a) a.begin(), a.end()

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

#define fst first

#define snd second

#define pb push_back

#define lowbit(x) (x&(-x))

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define rep1(i,x,y) for(int i=x;i<=y;i++)

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

using namespace std;

const double eps = 1e-10;

typedef long long ll;

typedef long long ll;

typedef pairpii;

const int oo =0x3f3f3f3f;

const int maxn=2020;

const int maxm=30000;

struct edge

edge() {}

};struct mcmf

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

bool spfa(int s, int t, int& flow, int& cost)}}

}if(d[t]==oo)return false;

flow+=a[t];

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

int u=t;

while(u!=s)

return true;

}int mincost(int s, int t)

} net;

int s,t,n,m;

int main()

rep1(i,1,n) net.add(i,i+n,(i==1 || i==n?2:1),0);

net.add(s,1,2,0);

int ans = net.mincost(s,n+n);

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

}return 0;

}/**

6 11

1 2 23

1 3 12

1 4 99

2 5 17

2 6 73

3 5 3

3 6 21

4 6 8

5 2 33

5 4 5

6 5 20

**/

poj1459 網路流經典

題意 給幾個發電站,給幾個消耗站,再給幾個 點。發電站只發電,消耗站只消耗電,點只是 電,再給各個傳送線的傳電能力。問你消耗站能獲得的最多電是多少。思路 增加乙個超級源點,和超級匯點。把所給的發電站都和超級源點相連,把所給的消耗戰都和超級匯點相連。用ek求最大流。include include us...

hdu3879 網路流(經典最大獲利問題)

這題建圖自己想了半天搞不懂,然後看了一下別人的建圖。一臉茫然。最後去看了下胡波濤的 最小割模型在資訊學競賽的應用 裡面詳細的講解了將最大獲利問題轉換為最小割模型的過程。建圖 源點與人連邊,容量為獲利。站點與匯點連邊,容量為耗資。然後是相應的人與其需求的站點連邊,容量為無窮。這樣建圖就完成了,然後就是...

poj 3498 網路流 拆點

題意 某個冰塊上有a只企鵝,總共可以跳出去b只,問是否可能所有的企鵝都跳到某一塊冰塊上,輸出所有的可能的冰塊的編號。由於每個點只能跳出去m只企鵝,所以要拆點 假如不拆點,乙個點到另乙個點可能會跳多於m只企鵝 通過拆點後u u 間的容量來完成題目的要求 對點的一些限制 建圖 i i n 容量為m i ...