leoanjos

Homework

Feb 13th, 2023
979
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define llong long long int
  6.  
  7. const llong INF = 1e9 + 7;
  8.  
  9. class Dinic{
  10.     int N;
  11.     vector<llong> level;
  12.     vector<bool> dead;
  13.    
  14. public:
  15.     struct Edge{
  16.         Edge(int a,llong x){
  17.             v = a;
  18.             cap = x;
  19.         }
  20.         int v;
  21.         llong cap;
  22.     };
  23.     int source;
  24.     int sink;
  25.     vector<Edge> edge;
  26.     vector<vector<int>> g;
  27.  
  28.     Dinic(int n){
  29.         g.resize(n);
  30.         N = n;
  31.         level.resize(n);
  32.     }
  33.  
  34.     void setInit(int u,int v){
  35.         source = u;
  36.         sink = v;
  37.     }
  38.  
  39.     void addEdge(int u,int v,llong cap){
  40.         g[u].push_back(edge.size());
  41.         edge.push_back(Edge(v,cap));
  42.         g[v].push_back(edge.size());
  43.         edge.push_back(Edge(u,0));
  44.     }
  45. private:
  46.  
  47.     bool BFS(){
  48.        
  49.         for(int i=0;i<N;i++) level[i] = INF;
  50.         level[source] = 0;
  51.         queue<int> q;
  52.         q.push(source);
  53.  
  54.         while(!q.empty()){
  55.  
  56.             int u = q.front();
  57.             q.pop();
  58.  
  59.             if(u == sink) return true;
  60.  
  61.             for(auto x: g[u]){
  62.                 if(level[edge[x].v] == INF && edge[x].cap > 0){
  63.                     level[edge[x].v] = level[u] + 1;
  64.                     q.push(edge[x].v);
  65.                 }
  66.             }
  67.         }
  68.         return false;
  69.     }
  70.  
  71.     llong maxflow(int u,llong flow){
  72.  
  73.         llong ret = 0;
  74.         llong f = 0;
  75.         if(flow == 0) return 0;
  76.         if(u == sink) return flow;
  77.  
  78.         for(auto i: g[u]){
  79.             if(level[edge[i].v] != level[u] + 1) continue;
  80.             f = maxflow(edge[i].v,min(edge[i].cap,flow));
  81.             int x = (i%2 == 0?i+1:i-1);
  82.             flow -= f;
  83.             ret += f;
  84.             edge[i].cap -= f;
  85.             edge[x].cap += f;
  86.         }
  87.        
  88.         if(ret == 0) level[u] = INF;
  89.        
  90.         return ret;
  91.     }
  92. public:
  93.     llong run(){
  94.  
  95.         llong flow = 0;
  96.         while(BFS()){
  97.             flow += maxflow(source,INF);
  98.         }
  99.  
  100.         return flow;
  101.     }
  102. };
  103.  
  104. int main() {
  105.     ios_base::sync_with_stdio(false);
  106.     cin.tie(NULL);
  107.  
  108.     int n, m;
  109.     cin >> n >> m;
  110.  
  111.     vector<int> diff(n, 0);
  112.     Dinic solver(n + m + 2);
  113.     int src = 0, snk = n + m + 1;
  114.  
  115.     for (int i = 1; i <= m; i++) {
  116.         int u, v, d;
  117.         cin >> u >> v >> d;
  118.  
  119.         if (!d) {
  120.             diff[u - 1]++;
  121.             diff[v - 1]++;
  122.  
  123.             solver.addEdge(src, i, 1);
  124.             solver.addEdge(i, m + u, 1);
  125.             solver.addEdge(i, m + v, 1);
  126.         } else {
  127.             diff[u - 1]++;
  128.             diff[v - 1]--;
  129.         }
  130.     }
  131.  
  132.     int sum = 0;
  133.     bool possible = true;
  134.  
  135.     for (int i = 0; i < n && possible; i++) {
  136.         if (diff[i] < 0 || (diff[i] & 1)) possible = false;
  137.         else {
  138.             sum += diff[i] / 2;
  139.             solver.addEdge(m + i + 1, snk, diff[i] / 2);
  140.         }
  141.     }
  142.  
  143.     if (!possible) cout << "NO\n";
  144.     else {
  145.         solver.setInit(src, snk);
  146.         possible = solver.run() == sum;
  147.         cout << (possible ? "YES" : "NO") << "\n";
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment