1. 程式人生 > >loj 1167(二分+最大流)

loj 1167(二分+最大流)

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<cmath>
  7 using namespace std;
  8 #define MAXN 222
  9 #define MAXM 222222
 10 #define inf 1<<30
 11 #define FILL(a,b) memset(a,b,sizeof(a))
 12
13 struct Edge{ 14 int v,cap,next; 15 }edge[MAXM]; 16 17 int n,m,vs,vt,k,NV,NE; 18 int head[MAXN]; 19 20 void Insert(int u,int v,int cap) 21 { 22 edge[NE].v=v; 23 edge[NE].cap=cap; 24 edge[NE].next=head[u]; 25 head[u]=NE++; 26 27 edge[NE].v=u; 28 edge[NE].cap=0
; 29 edge[NE].next=head[v]; 30 head[v]=NE++; 31 } 32 33 int level[MAXN],gap[MAXN]; 34 void bfs(int vt) 35 { 36 FILL(level,-1); 37 FILL(gap,0); 38 queue<int>que; 39 level[vt]=0; 40 gap[0]++; 41 que.push(vt); 42 while(!que.empty()){ 43 int u=que.front();
44 que.pop(); 45 for(int i=head[u];i!=-1;i=edge[i].next){ 46 int v=edge[i].v; 47 if(level[v]!=-1)continue; 48 level[v]=level[u]+1; 49 gap[level[v]]++; 50 que.push(v); 51 } 52 } 53 } 54 55 int pre[MAXN],cur[MAXN]; 56 int SAP(int vs,int vt) 57 { 58 bfs(vt); 59 memcpy(cur,head,sizeof(head)); 60 int u=pre[vs]=vs,aug=inf,maxflow=0; 61 gap[0]=NV; 62 while(level[vs]<NV){ 63 bool flag=false; 64 for(int &i=cur[u];i!=-1;i=edge[i].next){ 65 int v=edge[i].v; 66 if(edge[i].cap>0&&level[u]==level[v]+1){ 67 flag=true; 68 aug=min(aug,edge[i].cap); 69 pre[v]=u; 70 u=v; 71 if(v==vt){ 72 maxflow+=aug; 73 for(u=pre[u];v!=vs;v=u,u=pre[u]){ 74 edge[cur[u]].cap-=aug; 75 edge[cur[u]^1].cap+=aug; 76 } 77 aug=inf; 78 } 79 break; 80 } 81 } 82 if(flag)continue; 83 int minlevel=NV; 84 for(int i=head[u];i!=-1;i=edge[i].next){ 85 int v=edge[i].v; 86 if(edge[i].cap>0&&level[v]<minlevel){ 87 minlevel=level[v]; 88 cur[u]=i; 89 } 90 } 91 if(--gap[level[u]]==0)break; 92 level[u]=minlevel+1; 93 gap[level[u]]++; 94 u=pre[u]; 95 } 96 return maxflow; 97 } 98 99 struct Path{ 100 int u,v,d; 101 }path[MAXM]; 102 103 void Build(int limit) 104 { 105 NE=0; 106 memset(head,-1,sizeof(head)); 107 vs=0,vt=2*n+3,NV=2*n+4; 108 for(int i=0;i<m;i++){ 109 if(path[i].d<=limit)Insert(path[i].u+n+2,path[i].v,1); 110 } 111 for(int i=1;i<=n;i++)Insert(i,i+n+2,1); 112 Insert(vs,vs+n+2,11); 113 Insert(n+1,vt,11); 114 } 115 116 117 int main() 118 { 119 int _case,u,v,d,low,high,mid,ans,t=1; 120 scanf("%d",&_case); 121 while(_case--){ 122 scanf("%d%d",&n,&m); 123 low=inf,high=0; 124 for(int i=0;i<m;i++){ 125 scanf("%d%d%d",&path[i].u,&path[i].v,&path[i].d); 126 if(path[i].u>path[i].v)swap(path[i].u,path[i].v); 127 //cout<<path[i].u<<"&&&&"<<path[i].v<<endl; 128 low=min(low,path[i].d); 129 high=max(high,path[i].d); 130 } 131 // cout<<low<<"**"<<high<<endl; 132 scanf("%d",&k); 133 ans=inf; 134 while(low<=high){ 135 mid=(low+high)>>1; 136 Build(mid); 137 if(SAP(vs,vt)>=k){ 138 ans=mid; 139 high=mid-1; 140 }else 141 low=mid+1; 142 } 143 printf("Case %d: ",t++); 144 if(ans!=inf){ 145 printf("%d\n",ans); 146 }else 147 puts("no solution"); 148 } 149 return 0; 150 }

相關推薦

loj 1167(二分+

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include&l

UVA 1345 Jamie's Contact Groups(二分+

題意:有n個人,m個組,給出每個人想要去的分組,每個人只能去一個組,問人數最多的那個組最少有多少個人 二分一下每個組的可以放的人數,然後每個組與匯點相連,容量為二分的值,源點與每個人相連,容量為1,每個人與想去的組連邊,容量為1,跑一邊最大流判斷即可 #include

luoguP1401 城市(二分答案+

bsp eof 二分 dinic add b- 然而 main dfs 題意 N(2<=n<=200)個城市,M(1<=m<=40000)條無向邊,你要找T(1<=T<=200)條從城市1到城市N的路,使得最長的邊的長度最小,邊不能重復用

網路24題 P3254 圓桌問題 (二分圖多重匹配轉

假設有來自m 個不同單位的代表參加一次國際會議。每個單位的代表數分別為ri (i =1,2,……,m)。 會議餐廳共有n 張餐桌,每張餐桌可容納ci (i =1,2,……,n)個代表就餐。 為了使代表們充分交流,希望從同一個單位來的代表不在同一個餐桌就餐。試設計一個演算

【洛谷 P2756】 飛行員配對方案問題(二分圖匹配,

題目連結 這不是裸的二分圖匹配嗎? 而且匈牙利演算法自帶記錄方案。。 但既然是網路流24題,那就用網路流來做吧。 具體就是從源點向左邊每個點連一條流量為1的邊,兩邊正常連邊,流量都是一,右邊所有點向匯點連一條流量為1的邊,然後跑\(Dinic\)就行了。 怎麼記錄方案?列舉左邊所有點連的所有邊,如果剩餘流量為

CODEFORCES:103E(二分圖匹配&

CODEFORCES 103E(二分圖匹配&最大流)參考:1. 題目E. Buying SetsThe Hexadecimal virus loves playing withnumber sets — intersecting them, uniting them.

[網路24題] 18 分配問題(二分圖最佳匹配,小費用

題目大意: 有n個工作要分配給n個人做,給出每個人做每件工作所產生的效益, 求出最小總效益和最大總效益; 思路分析: 這道題 和17題的思路是一樣的; ①:設立一個源點s,從s向每個人連一條邊,容量為1, 費用為0; ②:從每個人向每個工作連一條邊,容量為INF,費用為這個

【網路24題】試題庫(二分圖+

傳送門     試題庫 I think     點集x,y分別放置試題與型別。源點向x集點連容量為1的邊,x集點向y中其所屬型別連容量為1的邊,y集點向T連容量為所需量的邊,求解最大流若等於總題數

【洛谷 P3191】 [HNOI2007]緊急疏散EVACUATE(二分答案,

size ems ons ++ pri scan += define while 題目鏈接 sb錯誤調了3hour+。。 bfs預處理出每個\(.\)到每個\(D\)的最短距離。 二分時間\(t\),把每個\(D\)拆成\(t\)個點,這\(t\)個點兩兩連邊,流量\(IN

[HDOJ3998] Sequence(DP,

好的 hdoj 一個點 include type div c++ cnblogs span 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 給數字,問LIS以及每一個數字只取一次,最多能取多少個LIS。 LIS直接O(

HDU 2732 Leapin&#39; Lizards(拆點+

pre rac eof init def mat ron first typedef HDU 2732 Leapin‘ Lizards 題目鏈接 題意:有一些蜥蜴在一個迷宮裏面,有一個跳躍力表示能跳到多遠的柱子,然後每根柱子最多被跳一定次數,求這些蜥蜴還有多少是不

[luoguP2766] 長遞增子序列問題(

close spl 方法 emp 路徑 pid code display div 傳送門 題解來自網絡流24題: 【問題分析】 第一問時LIS,動態規劃求解,第二問和第三問用網絡最大流解決。 【建模方法】 首先動態規劃求出F[i],表示以第i位為開頭的最長上

[cogs729]圓桌問題(

for isp front 集合 targe 一個人 getchar 分析 freopen 傳送門 模型 二分圖多重匹配問題,可以用最大流解決。 實現 建立二分圖,每個單位為X集合中的頂點,每個餐桌為Y集合中的頂點,增設附加源S和匯T。 1、從S向每個Xi頂

[BZOJ4808] 馬(獨立集,

匹配 truct esp urn ont code freopen pop += 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=4808 題意:其實就是找出一個點集的子集,使得這個子集中的點互不相連。求這個子集規模

Hdu 4280 Island Transport(

search acc describes main end ble acm erl rect Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536

[CODEVS1915] 分配問題(小費用

min inline == getc digi empty getchar() clu spfa 傳送門 腦殘題 建圖都懶得說了 ——代碼 1 #include <queue> 2 #include

[luoguP2045] 方格取數加強版(小費用

col pid opened empty spl amp turn define aps 傳送門 水題 ——代碼 1 #include <queue> 2 #include <cstdio>

POJ 3281 Dining(

http div tdi 最大流 .org scan right printf dining POJ 3281 Dining 題目鏈接 題意:n個牛。每一個牛有一些喜歡的食物和飲料。每種食物飲料僅僅有一個。問最大能匹配上多少僅僅牛每一個牛都能吃上喜歡的食物和喜歡的

uva 10806 Dijkstra, Dijkstra. (小費

content clu cap from down 必須 正向 push_back 最大流 uva 10806 Dijkstra, Dijkstra. 題目大意:你和你的夥伴想要越獄。你的夥伴先去探路,等你的夥伴到火車站後,他會打電話給你(電話是藏

uvalive 3231 Fair Share 公平分配問題 二分+ 右邊多流量的結點流量盡量少。

init targe memset save amp class tps blog ext /** 題目: uvalive 3231 Fair Share 公平分配問題 鏈接:https://vjudge.net/problem/UVALive-3231 題意:有m個任務