zoukankan      html  css  js  c++  java
  • 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm

    缩点后转化成 DAG图上的单源最长路问题。spfa/dp随便。

     1 #include<cstdio>
     2 #include<queue>
     3 #include<algorithm>
     4 #include<vector>
     5 #include<cstring>
     6 using namespace std;
     7 int cmp[500001],sum,n,m,Us[500001],Vs[500001],t,w[500001],sta,k,ans,dis[500001];
     8 bool vis[500001],inq[500001];
     9 struct Edge{int v,w;Edge(const int &a,const int &b){v=a;w=b;}Edge(){}};
    10 vector<int>G[500001],rG[500001],G2[500001],vs;
    11 typedef vector<int>::iterator ITER;
    12 queue<int>q;
    13 void dfs(int U)
    14 {
    15     vis[U]=1;
    16     for(ITER it=G[U].begin();it!=G[U].end();++it) if(!vis[*it]) dfs(*it);
    17     vs.push_back(U);
    18 }
    19 void dfs2(int U)
    20 {
    21     cmp[U]=sum;
    22     for(ITER it=rG[U].begin();it!=rG[U].end();++it) if(!cmp[*it]) dfs2(*it);
    23 }
    24 void scc()
    25 {
    26     for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);
    27     ITER it=vs.end(); --it;
    28     for(;;it--)
    29       {
    30         if(!cmp[*it]) {++sum; dfs2(*it);}
    31         if(it==vs.begin()) break;
    32       }
    33 }
    34 void spfa(const int &s)
    35 {
    36     dis[s]=w[s]; q.push(s); inq[s]=1;
    37     while(!q.empty())
    38       {
    39         int U=q.front();
    40         for(ITER it=G2[U].begin();it!=G2[U].end();it++)
    41           if(dis[*it]<dis[U]+w[*it])
    42             {
    43               dis[*it]=dis[U]+w[*it];
    44               if(!inq[*it])
    45                 {
    46                   q.push(*it);
    47                   inq[*it]=1;
    48                 }
    49             }
    50         q.pop(); inq[U]=0;
    51       }
    52 }
    53 int main()
    54 {
    55     scanf("%d%d",&n,&m);
    56     for(int i=1;i<=m;++i)
    57       {
    58           scanf("%d%d",&Us[i],&Vs[i]);
    59           G[Us[i]].push_back(Vs[i]);
    60           rG[Vs[i]].push_back(Us[i]);
    61       } scc();
    62     for(int i=1;i<=n;++i) {scanf("%d",&t); w[cmp[i]]+=t;}
    63     for(int i=1;i<=m;++i)
    64       if(cmp[Us[i]]!=cmp[Vs[i]])
    65         G2[cmp[Us[i]]].push_back(cmp[Vs[i]]);
    66     scanf("%d%d",&sta,&k);
    67     spfa(cmp[sta]);
    68     for(int i=1;i<=k;++i)
    69       {
    70           scanf("%d",&t);
    71           ans=max(dis[cmp[t]],ans);
    72       } printf("%d
    ",ans);
    73     return 0;
    74 }
  • 相关阅读:
    code3728 联合权值
    Codevs 4600 [NOI2015]程序自动分析
    code1540 银河英雄传说
    code1074 食物链
    堆排序
    哈夫曼树与哈夫曼码
    优先队列用法
    code1154 能量项链
    code1225 八数码Bfs
    javascript5
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4132876.html
Copyright © 2011-2022 走看看