題意:
給定乙個有向網路,每條邊均有乙個容量。問是否存在乙個從點1到點n,流量為c的流。如果不存在,是否可以恰好修改一條弧的容量,使得存在這樣的流?
分析:先跑一遍最大流,如果最大流大於等於c,則輸possible。如果最大流小於c,則表明需要修改邊的流量。很顯然,需要修改的弧一定是滿流的弧。但是如果直接暴力會超時,所以我們可以有兩個優化。
1.第一次求完最大流以後,把每條弧的流量儲存下來,每次修改完一條弧的容量以後,都從當前殘量網路開始繼續增廣。
2.每次不需要增廣到最大流,當流量大於等於c的時候就停止增廣(不過不加這個優化好像也沒事,反正我沒加··)
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7view code8using
namespace
std;
9const
int maxn=100+10;10
const
int maxm=20000+10;11
const
int inf=2147000000;12
struct
dinic
22void add_edge(int a,int b,int
c)30
bool
bfs()45}
46}47return
vis[t];48}
49int dfs(int x,int
a)61}62
return
flow;63}
64int maxflow(int s,int
t)71
return
flow;72}
73}dinic;
74struct
edge
79};
80 vectorans;
81int
kase,n,e,c;
82int
main()
94int maxflow=dinic.maxflow(1
,n);
95if(maxflow>=c)else
102int cap,c=c-maxflow;
103for(int i=0;i<=dinic.sz;i+=2
));113
}114 dinic.cap[i]=cap;
115 dinic.cap[i^1]=cap;
116for(int i=0;i<=dinic.sz;i++)dinic.flow[i]=flow[i];
117}
118}
119if(ans.size()==0
)else
128 printf("\n"
);129
}130
}131
}132
return0;
133 }
UVA11248 網路擴容(列舉割邊擴充)
題意 給你乙個有向圖,問你從1到n的最大流是多少?如果流量大於等於c那麼直接輸出乙個串,否則輸出只擴充一條邊的流量就可以達到1 n大於等於c的所有邊,如果擴充不了就 輸出另乙個串。sample input 4 4 5 1 2 5 1 3 5 2 4 5 3 4 5 4 4 5 1 2 1 1 3 5...
LA2531 訓練指南 足球聯賽 最大流
題意 有n支隊伍進行比賽,每支隊伍需要打的比賽數目相同。每場比賽恰好一支隊伍勝,另一支敗。給出每支隊伍目前勝的場數和敗的場數,以及每兩支隊伍還剩下的比賽場數,確定所有可能的冠軍的球隊。獲勝場數最多的是冠軍,可以並列 分析乙隻隊伍如果可能得冠軍,那麼就一定可以通過調整,未來的幾場比賽的結果使自己贏得場...
LA3211 訓練指南 飛機排程 2 sat
題意 有n嫁飛機需要著陸。每架飛機都可以選擇 早著陸 和 晚著陸 兩種方式之一,且必須選擇一種。第i架飛機的早著陸時間為ei,晚著陸時間為li,不得在其他時間著陸。你的任務是為這些飛機安排著陸方式,使得整個著陸計畫盡量安全。話句話說,如果把所有飛機的實際著陸時間按照從早到晚的順序排列,相鄰兩個著陸時...