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 }
  • 相关阅读:
    MYSQL数据库基础
    MSYQL操数据DML
    MYSQL外键约束
    MYSQL多表查询
    MYSQL结果排序、分页查询、聚合函数
    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项”的解决方法
    由于扩展配置问题而无法提供您请求的页面。
    JS中的prototype(转载)
    mvc表单如何绑定bool类型的属性或变量
    使用c#正则验证关键字并找出匹配项
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4132876.html
Copyright © 2011-2022 走看看