poj 2455 二分 最大流

2021-06-22 05:42:45 字數 1532 閱讀 9970

思路:求1-n的路徑中最長段的最小值,顯然要用到二分,我們二分最長段,如果當前u,v的距離小於等於limit,則連邊(雙向邊),邊容量為1,代表只能走1次。然後就是以1為源點,n為匯點跑最大流,如果maxflow>=t,則在(low,mid)中搜尋,否則就在(mid,high)中搜尋。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 444

8#define maxm 44444444

9#define inf 1<<30

1011

struct

edgeedge[maxm];

1415

struct

ee[maxn*maxn];

1819

intn,m,t,ne,nv;

20int

head[maxn];

2122

void insert(int u,int v,int

cap)

2334

35int

level[maxn],gap[maxn];

36void bfs(int

vt)3754}

55}56}

5758

intpre[maxn],cur[maxn];

59int sap(int vs,int

vt)60

82 aug=inf;83}

84break;85

}86}87

if(flag)continue;88

int minlevel=nv;

89for(int i=head[u];i!=-1;i=edge[i].next)95}

96if(--gap[level[u]]==0)break

;97 level[u]=minlevel+1

;98 gap[level[u]]++;

99 u=pre[u];

100}

101return

maxflow;

102}

103104

105void build(int

limit)

106114

}115

}116

117118

intmain()

119128 nv=n;

129 low=0,high=limit+1,min=0

;130

while(low<=high)else

137 low=mid+1

;138

}139 printf("

%d\n

",min);

140}

141return0;

142 }

view code

poj 2455 二分 最大流

思路 求1 n的路徑中最長段的最小值,顯然要用到二分,我們二分最長段,如果當前u,v的距離小於等於limit,則連邊 雙向邊 邊容量為1,代表只能走1次。然後就是以1為源點,n為匯點跑最大流,如果maxflow t,則在 low,mid 中搜尋,否則就在 mid,high 中搜尋。1 include...

poj2455 二分最大流裸題

一道二分最大流的裸題 問你john要從1號去n號點t次 到了n號點直接瞬間移動回1號點,就是直接把他放回1號點,且之前走的邊不能再走了 問在這t次中走的最長的一條邊最小是多少 注意 不是從1號到n號的總距離的最大值 而是某條邊的最大值 二分距離 如果某條邊的流量 mid 則加入這條邊 最後求最大流 ...

poj 2455(二分加網路流(dinic))

處理重邊,想不出什麼好的方法。只好用了前向星來寫鄰接表儲存。不是很難不多說什麼了。include include include includeusing namespace std const int maxm 80005 const int inf int max define cc m,v m...