首页 > 代码库 > 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm
【强联通分量缩点】【最短路】【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\n",ans);73 return 0;74 }
【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。