poj 3680 最小費用最大流

2021-09-06 11:46:24 字數 1283 閱讀 3042

思路:因為n<=200,而區間範圍為【1,100000】,因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 444

8#define maxm 444444

9#define inf 1<<30

1011

struct

edgeedge[maxm];

1415

intvs,vt,ne,n,m;

16int

head[maxn];

1718

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

cost)

1932

33int

pre[maxn],cur[maxn];

34int

dist[maxn];

35bool

mark[maxn];

36bool spfa(int vs,int

vt)3757}

58}59}

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

6263

int mincostflow(int vs,int

vt)64

71 flow+=aug,cost+=dist[vt]*aug;

72for(int u=vt;u!=vs;u=pre[u])76}

77return

cost;78}

7980

struct

lineline[maxn];

8384

intnum[maxn];

8586

intmain()

87100 sort(num,num+cnt);

101 cnt=unique(num,num+cnt)-num;

102for(int i=1;i<=cnt;i++)

105for(int i=1;i<=n;i++)

110 printf("

%d\n

",mincostflow(0

,cnt));

111}

112return0;

113 }

view code

poj 3680 最小費用最大流

思路 因為n 200,而區間範圍為 1,100000 因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。1 include2 include3 include4 include5 include6 using ...

POJ 3680 最小費用最大流

include include include include include include using namespace std const int maxn 500 const int maxm 1e5 10 const int inf 0x3f3f3f3f struct edge edge...

最小費用最大流POJ 3680

類似問題,比如有k的限制,某件事情只能做k次,或者事件一一對應,都可以建圖跑流來解決。比線段樹好使我感覺。從s 1 2 3 t建立一條通路 先離散化了頂點的,離散模板就好了 代價為零,流量為k 其實是多少無所謂,比k就行 然後如果1 3有區間的話,就建立一條負的代價,因為求的是最大費用,模板我們都是...