Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define mp make_pair
- #define pb push_back
- #define pii pair <int, int>
- #define piii pair<pii, int>
- #define vi vector<int>
- #define vpii vector<pii>
- #define read1(a) int a; scanf("%d", &a)
- #define read2(a, b) int a, b; scanf("%d %d", &a, &b)
- #define read3(a, b, c) int a, b, c; scanf("%d %d %d", &a, &b, &c)
- #define FOR(i, a, b) for (int i=a; i<b; i++)
- #define F0R(i, a) for (int i=0; i<a; i++)
- #define readgi(n) F0R(i, n) { scanf("%d", &arr[i]); }
- #define readgs(n) F0R(i, n) { scanf(" %c", &arr[i]); }
- #define f first
- #define s second
- #define usaco(in, out) freopen(in, "r", stdin); freopen(out, "w", stdout);
- #define println1(a) printf("%d\n", a);
- #define println2(a, b) printf("%d %d\n", a, b);
- #define println3(a, b, c) printf("%d %d %d\n", a, b, c);
- #define pv(v) for (int i : v) { printf("%d ", i); } printf("\n");
- const int MOD = 1000000007;
- const int MAX = 205;
- int arr[MAX];
- ll source = 1, sink = 1, inf = (ll)1e15;
- ll n,m;
- ll c[MAX][MAX];
- vector<int> adj[MAX];
- void gen(){
- F0R(i, MAX) { F0R(j, MAX) { c[i][j] = 0; adj[i].clear(); } }
- for(ll i = 0; i < m; ++i){
- ll a,b,cap;
- cin >> a >> b >> cap;
- if(a!=b){
- /* **************** */
- /* MODIFY THIS PART */
- /* **************** */
- adj[a].push_back(b);
- adj[b].push_back(a);
- c[a][b]+=cap;
- }
- }
- for(ll i = 0; i < MAX; ++i){
- sort(adj[i].begin(),adj[i].end());
- adj[i].resize(unique(adj[i].begin(),adj[i].end())-adj[i].begin());
- }
- }
- int visited[MAX];
- int lvl[MAX];
- int now[MAX];
- bool dinic_bfs(){
- vector<ll> bfs;
- bfs.push_back(source);
- lvl[source]=1;
- for(int i = 0; i < bfs.size(); ++i){
- ll pos = bfs[i];
- for(ll j = 0; j < adj[pos].size(); ++j){
- ll nxt = adj[pos][j];
- if(lvl[nxt]==0&&c[pos][nxt]>0){
- bfs.push_back(nxt);
- lvl[nxt]=lvl[pos]+1;
- }
- }
- }
- return lvl[sink]!=0;
- }
- ll dinic_dfs(ll pos, ll flow){
- visited[pos]=true;
- if(pos==sink)
- return flow;
- while(now[pos]<adj[pos].size()){
- ll nxt = adj[pos][now[pos]];
- if(!visited[nxt]&&(lvl[pos]+1==lvl[nxt])&&c[pos][nxt]>0){
- ll path = dinic_dfs(nxt,min(flow,c[pos][nxt]));
- if(path>0){
- c[pos][nxt]-=path;
- c[nxt][pos]+=path;
- return path;
- }
- }
- now[pos]++;
- }
- return 0;
- }
- ll dinic(){
- ll ans = 0;
- F0R(i, MAX) { now[i] = 0; lvl[i] = 0; visited[i] = 0; }
- while(true){
- for(int i = 0; i < MAX; ++i)
- now[i]=0,lvl[i]=0;
- if(dinic_bfs()){
- while(true){
- for(int i = 0; i < MAX; ++i)
- visited[i]=0;
- ll cur = dinic_dfs(source,inf);
- if(cur==0)
- break;
- ans+=cur;
- }
- }
- else
- return ans;
- }
- }
- int main(){
- usaco("ditch.in", "ditch.out");
- cin >> m >> n;
- sink = n;
- gen();
- cout << dinic() << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement