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;
}
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;
}
相关文章推荐
- BZOJ 1179: [Apio2009]Atm Tarjan强连通分量缩点,SPFA,DP
- 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm
- bzoj1179 [Apio2009]Atm(tarjan缩点+spfa)
- [BZOJ1179] [Apio2009]Atm(tarjan缩点 + spfa)
- BZOJ 1179: [Apio2009]Atm(tarjan缩点+spfa)
- BZOJ_1179_[Apio2009]Atm_tarjan+spfa
- 【tarjan+SPFA】BZOJ1179-[Apio2009]Atm
- [BZOJ 1179][Apio2009]Atm:Tarjan+SPFA
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
- bzoj 1179 [APIO 2009]Atm(APIO水题) - Tarjan - spfa
- BZOJ 1179: [Apio2009]Atm(tarjan+SPFA)
- [BZOJ1179][Apio2009]Atm(tarjan+spfa)
- [bzoj1179][Apio2009]Atm Tarjan+spfa
- BZOJ 1179 APIO2009 ATM Tarjan+堆优化SPFA
- bzoj 1179: [Apio2009]Atm【tarjan+spfa】
- BZOJ1179 : [Apio2009]Atm 缩点+spfa
- 【bzoj 1179】[Apio2009]Atm(Tarjan+spfa)
- 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)
- bzoj 1179[Apio2009]Atm (tarjan+spfa)