• P2153-[SDOI2009]晨跑


      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;
     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 main()
     84 {
     85     n = read();
     86     m = read();
     87     s = 1;
     88     t = n+n;
     89     tot = 1;
     90     maxflow = 0;
     91     add(1,1+n,INF,0);
     92     add(n,n+n,INF,0);
     93     _for(i,2,n)
     94         add(i,i+n,1,0);
     95     _for(i,1,m+1)
     96     {
     97         int x = read();
     98         int y = read();
     99         int c = read();
    100         add(x+n,y,1,c);
    101     }
    102     while(spfa()) update();
    103     printf("%d %d",maxflow,ans);
    104     return 0;
    105 }
  • 相关阅读:
    Ubuntu16.04下搭建LAMP环境
    关于下载SAE日志签名认证的方法——PHP版
    时隔这么长时间,又回来写博客了
    转战网站后台与python
    学习之路
    周末随笔
    Shell基础-环境变量配置文件
    关于骑行
    MYSQL 8.0 linux安装步骤
    一个golang项目笔记 (二) 动态加载库
  • 原文地址:https://www.cnblogs.com/Asurudo/p/11655346.html
Copyright © 2020-2023  润新知