您的位置:首页 > 其它

bzoj 1179 [Apio2009]Atm tarjan强联通缩点+SPFA

2018-01-17 23:12 495 查看
我的首篇题解博客。大约也是第一道bzoj AC 能一遍AC真的很激动裸tarjan缩点+SPFA 最长路/* bzoj 1179
tarjan缩点+spfa最长路
-2018-1-15
by xfydemx
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
const int N=500020;
int head
,head1
,n,m,k,t,inde,ind,flag;
int fl,fg,cnt,scnt,q,e,s,ans,f,p;
int dfn
,low
,myy
,bel
,mny
,dis
;
bool stk
,que
,jvb
;
struct Edge{
int f,nxt,to;
}a
;
Edge b
;
void add(int x,int y){
inde++;
a[inde].f=x;
a[inde].to=y;
a[inde].nxt=head[x];
head[x]=inde;
}
void add1(int x,int y){
ind++;
b[ind].f=x;
b[ind].to=y;
b[ind].nxt=head1[x];
head1[x]=ind;
}
stack<int> G;
queue<int> Q;
int tarjan(int x){
dfn[x]=low[x]=++t;
G.push(x);
stk[x]=1;
for(int i=head[x];i;i=a[i].nxt){
int y=a[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(stk[y]) low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
cnt++;int v;
do{
v=G.top();
G.pop();
stk[v]=0;
bel[v]=cnt;
}while(v!=x);
}
}
int spfa(int u){
// memset(dis,0x3f,sizeof(dis));
dis[u]=myy[u];
Q.push(u);
while(!Q.empty()){
int x=Q.front();
Q.pop();
que[x]=0;
for(int i=head1[x];i;i=b[i].nxt){
int y=b[i].to;
if(dis[y]<dis[x]+myy[y]){
dis[y]=dis[x]+myy[y];
if(!que[y]) Q.push(y);
que[y]=1;
}
}
}
}
void rebuild(){
for(int i=1;i<=m;i++){
if(bel[a[i].f]!=bel[a[i].to]){
add1(bel[a[i].f],bel[a[i].to]);
}
}
for(int i=1;i<=n;i++){
myy[bel[i]]+=mny[i];
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>q>>e;
add(q,e);
}
for(int i=1;i<=n;i++){
cin>>mny[i];
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
rebuild();
cin>>s>>p;
spfa(bel[s]);
for(int i=1;i<=p;i++){
cin>>k; jvb[bel[k]]=1;
}
for(int i=1;i<=cnt;i++){
if(jvb[i]) ans=max(ans,dis[i]);
}
cout<<ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: