zoukankan      html  css  js  c++  java
  • P2604-[ZJOI2010]网络扩容

      1 #include<bits/stdc++.h>
      2 #define _for(i,a,b) for(register int i = (a);i < b;i ++)
      3 #define _rep(i,a,b) for(register int i = (a);i > b;i --)
      4 #define INF 0x3f3f3f3f
      5 #define MOD 100000000
      6 #define maxn 100003
      7 #define pb push_back
      8 #define debug() printf("Miku Check OK!
    ")
      9 typedef long long ll;
     10 
     11 using namespace std;
     12 typedef pair<int,int> P;
     13 inline ll read()
     14 {
     15     ll ans = 0;
     16     char ch = getchar(), last = ' ';
     17     while(!isdigit(ch)) last = ch, ch = getchar();
     18     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
     19     if(last == '-') ans = -ans;
     20     return ans;
     21 }
     22 inline void write(ll x)
     23 {
     24     if(x < 0) x = -x, putchar('-');
     25     if(x >= 10) write(x / 10);
     26     putchar(x % 10 + '0');
     27 }
     28 int ver[maxn],Next[maxn],head[maxn],val[maxn],cost[maxn];
     29 //incf[i]为i在此趟BFS流过的流量
     30 int vis[maxn],incf[maxn],pre[maxn];
     31 int n,m,s,t,tot,maxflow,ans,k;
     32 int d[maxn];
     33 void add(int x,int y,int w,int c)
     34 {
     35     ver[++tot] = y,Next[tot] = head[x],head[x] = tot,val[tot] = w,cost[tot] = c;
     36     ver[++tot] = x,Next[tot] = head[y],head[y] = tot,val[tot] = 0,cost[tot] = -c;
     37 }
     38 bool spfa()
     39 {
     40     memset(vis,0,sizeof(vis));
     41     memset(d,0x3f,sizeof(d));
     42     queue<int> q;
     43     q.push(s);
     44     vis[s] = 1;
     45     d[s] = 0;
     46     incf[s] = INF;
     47     while(!q.empty())
     48     {
     49         int x = q.front();
     50         q.pop();
     51         vis[x] = 0;
     52         for(int i = head[x]; i; i = Next[i])
     53             if(val[i])
     54             {
     55                 int y = ver[i];
     56                 if(d[y] > d[x] + cost[i])
     57                 {
     58                     d[y] = d[x] + cost[i];
     59                     incf[y] = min(incf[x],val[i]);
     60                     pre[y] = i;
     61                     if(!vis[y])
     62                         vis[y] = 1,q.push(y);
     63                 }
     64             }
     65     }
     66     if(d[t]==INF)
     67         return false;
     68     return true;
     69 }
     70 void update()
     71 {
     72     int x = t;
     73     while(x != s)
     74     {
     75         int i = pre[x];
     76         val[i] -= incf[t];
     77         val[i^1] += incf[t];
     78         x = ver[i^1];
     79     }
     80     maxflow += incf[t];
     81     ans += d[t] * incf[t];
     82 }
     83 int cc[maxn];
     84 int main()
     85 {
     86     n = read();
     87     m = read();
     88     k = read();
     89     s = 1;
     90     t = n;
     91     tot = 1;
     92     maxflow = 0;
     93     _for(i,1,m+1)
     94     {
     95         int x = read();int y = read();int w = read();int c = read();
     96         cc[i] = c;
     97         add(x,y,w,0);
     98     }
     99     while(spfa()) update();
    100     int ans1 = maxflow;
    101     int ans2 = 0;
    102     _for(j,0,k)
    103     {
    104         _for(i,1,m+1)
    105         {
    106             int i2 = 2*i;
    107             if(!val[i2])
    108             {
    109                 val[i2] ++;
    110                 cost[i2] = cc[i];
    111             }
    112         }
    113         spfa(); update();
    114     }
    115     printf("%d %d",ans1,ans);
    116     return 0;
    117 }
  • 相关阅读:
    SQL Server Always on 日志收缩
    jq 获取某个元素是否鼠标悬停
    百度地图BMap实现在行政区域内做标注
    2021年终折腾总结
    ssr服务端渲染搭建
    windbg解决服务器cpu过高问题
    【工具】Java实现MD5算法
    【原创】Java创建对象与C++创建对象的比较
    【原创】C# 文件操作详解(二)FileInfo类
    【原创】JavaEE项目问题总结(1)
  • 原文地址:https://www.cnblogs.com/Asurudo/p/11661636.html
Copyright © 2011-2022 走看看