poj 3422 最小費用最大流

2021-09-06 11:45:22 字數 1348 閱讀 8537

思路:求從起點到終點走k次獲得的最大值,最小費用最大流的應用:將點權轉化為邊權,需要拆點,邊容量為1,費用為該點的點權,表示該點的權值只能獲取一次,另外,應該連一條容量為inf,費用為0的邊,因為每條邊都可以走多次。另外就是增加源點和匯點了,源點與起點連容量為k,費用為0的邊,表示可以走k次,同理終點與匯點也如此。然後就是求最大費用了,這與求最小費用類似,只需將spfa函式稍作修改即可。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 8888

8#define maxm 4444444

9#define inf 1<<30

1011

struct

edge edge[maxm];

1415

intn,m,vs,vt,ne;

16int

head[maxn];

1718

void insert(int u,int v,int cap,int

cost)

1932

33int

cur[maxn],pre[maxn];

34bool

mark[maxn];

35int

dist[maxn];

3637

bool spfa(int vs,int

vt)3858}

59}60}

61return dist[vt]!=-inf;62}

6364

65int mincostflow(int vs,int

vt)66

73 flow+=aug;

74 cost+=dist[vt]*aug;

75for(int u=vt; u!=vs; u=pre[u]) 79}

80return

cost;81}

8283

int map[55][55

];84

int dir[2][2]= ,};

8586

intmain()

87105

}106

}107 insert(vs,1,m,0

);108 insert(2*n*n,vt,m,0

);109 printf("

%d\n

",mincostflow(vs,vt));

110}

111return0;

112 }

view code

poj3422 最小費用最大流

記得以前做過這樣類似的題,因為那時候求的是來回的最大值,直接使用的dp,而且對費用流並不是很清楚,然後又看到了這道題。對點進行拆分建圖,乙個點拆為兩個點a和b,在a和b之間建一條花費為輸入值容量為1的邊,然後再建一條花費為0容量為k 1的邊,對b點對於其右邊和下邊都建立一條容量為k花費為0的邊,加入...

POJ 3422 最大流最小費用

題目大意 給定一張網格圖,需要從 1,1 走到 n,n 走k條路,每次走到乙個格仔上會把它的值變為0並且加到sum上去,問sum的最大值是多少 題目解析 構圖考慮到走一次費用就變成了0,所以乙個點要拆成2的點兩個點之間有一條邊容量為1,另一條容量為k 1,費用為0 因為是最大費用,只要把所有的值變成...

POJ 3422 最小費用最大流

關鍵是如何處理 只能獲取一次 的問題,為此可以為每個點建立偽點,由兩條有向邊相連。原始點到偽點連一條容量為1,權值為負分數的邊 原始點到偽點連一條容量為無窮,權值為0的邊。前者表示分數只能拿一次,後者表示第二次第三次 可以繼續走這個點,但是不拿分數。負權是因為題目要求的是 最大費用 又因為最多走同乙...