• [Apio2009]Atm


      1 #include<cstdio>
      2 #include<cstring>
      3 #include<iostream>
      4 #include<string>
      5 #include<vector>
      6 #include<queue>
      7 #include<stack>
      8 #include<set>
      9 #include<algorithm>
     10 using namespace std;
     11 #define N 500001
     12 stack<int>Sta;
     13 queue<int>Que;
     14 struct edge
     15 {
     16     int u,v,next;
     17 }edge1[N],edge2[N];
     18 bool isBar[N],inStack[N];
     19 int low[N],dfn[N],belong[N],money[N],newMoney[N],cnt,Time,start;
     20 int maxMoney[N],head[N],head2[N];
     21  
     22 void add(int u, int v, int id)
     23 {
     24     edge1[id].u = u;
     25     edge1[id].v = v;
     26     edge1[id].next = head[u];
     27     head[u] = id;
     28 }
     29  
     30 void add2(int u, int v, int id)
     31 {
     32     edge2[id].u = u;
     33     edge2[id].v = v;
     34     edge2[id].next = head2[u];
     35     head2[u] = id;
     36 }
     37 void Tarjan(int s)
     38 {
     39     dfn[s] = low[s] = ++Time;
     40     Sta.push(s);
     41     inStack[s] = true;
     42     for(int u = head[s]; ~u; u = edge1[u].next)
     43     {
     44         int v = edge1[u].v;
     45         if(dfn[v] == 0){
     46             Tarjan(v);
     47             low[s] = min(low[s], low[v]);
     48         }
     49         else if(inStack[v] == true){
     50             low[s] = min(low[s], dfn[v]);
     51         }
     52     }
     53     if(dfn[s] == low[s])
     54         {
     55             cnt ++;
     56             while(!Sta.empty()){
     57               int temp = Sta.top(); Sta.pop();
     58               belong[temp] = cnt;
     59               newMoney[cnt] += money[temp];
     60               inStack[temp] = false;
     61               if(temp == s) break;
     62             }
     63         }
     64 }
     65  
     66 int spfa()
     67 {
     68     int ans = 0;
     69     Que.push(start);
     70     memset(maxMoney,0,sizeof(maxMoney));
     71     maxMoney[start] = newMoney[start];
     72     while(!Que.empty())
     73     {
     74         int now = Que.front(); Que.pop();
     75         for(int u = head2[now]; ~u; u = edge2[u].next)
     76         {
     77             int v = edge2[u].v;
     78             if(maxMoney[now] + newMoney[v] > maxMoney[v])
     79             {
     80                 maxMoney[v] = maxMoney[now] + newMoney[v];
     81                 Que.push(v);
     82             }
     83             if(isBar[v]) ans = max(ans, maxMoney[v]);
     84         }
     85     }
     86     return ans;
     87 }
     88  
     89 int main()
     90 {
     91     int n,m,a,b,s,p;
     92     scanf("%d%d",&n,&m);
     93     memset(head,-1,sizeof(head));
     94     for (int i = 0; i < m; i++) {
     95       /* code */
     96       scanf("%d%d",&a, &b);
     97       add(a,b,i+1);
     98     }
     99     for (int i = 1; i <= n; i++) {
    100       /* code */
    101       scanf("%d",&money[i]);
    102     }
    103     scanf("%d%d",&s,&p);
    104     memset(inStack,false,sizeof(inStack));
    105     memset(newMoney,0,sizeof(newMoney));
    106     memset(isBar,false,sizeof(isBar));
    107     memset(dfn,0,sizeof(dfn));
    108     cnt = Time = 0;
    109     for(int i = 1; i <= n; i++) if(dfn[i] == 0) Tarjan(i);
    110     if(cnt == 1) {printf("%d",newMoney[cnt]);return 0;}
    111     for(int i=0;i<p;i++)
    112     {
    113       scanf("%d", &a);
    114       isBar[belong[a]] = true;
    115     }
    116     start = belong[s];
    117     memset(head2,-1,sizeof(head2));
    118     int kkk = 0;
    119     for(int i =1; i <= n; i ++)
    120     {
    121         for(int u = head[i]; ~u; u = edge1[u].next){
    122             int v = edge1[u].v;
    123             if(belong[i] != belong[v]){
    124                 add2(belong[i],belong[v],++kkk);
    125             }
    126         }
    127     }
    128  
    129     int ans = spfa();
    130     printf("%d", ans);
    131 }
    View Code
  • 相关阅读:
    node获取请求参数的方法get与post请求
    express框架路由未导出错误:Router.use() requires a middleware function but got a Object
    移动端学习之理解WEB APP、Native APP、Hybrid APP以及React Native/uniapp包括H5、小程序等的区别与共通之处
    微信小程序
    “You may need an appropriate loader to handle this file type”
    vue-cli Cannot find module 'less'
    Node 跨域问题 Access to XMLHttpRequest at 'http://localhost:8080/api/user/login' from origin 'http://localhost:808
    Access denied for user 'root'@'localhost' (using password: YES)
    nrm : 无法加载文件 C:Users......因为在此系统上禁止运行脚本。
    继承树追溯
  • 原文地址:https://www.cnblogs.com/NWUACM/p/6921871.html
Copyright © 2020-2023  润新知