BZOJ1179【tarjan】【spfa】

来源:互联网 发布:excel查询数据库 编辑:程序博客网 时间:2024/06/06 00:52

tarjan缩点.然后用spfa找最长路.

/* I will wait for you */#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iostream>#include<fstream>#include<vector>#include<queue>#include<deque>#include<set>#include<map>#include<string>#define make make_pair#define fi first#define se secondusing namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pair<int,int> PII;const int maxn=500010;const int maxm=1010;const int maxs=26;const int INF=1<<29;const int P=1000000007;const double error=1e-9;struct edge{ int v,next; }e[maxn],re[maxn];int m,n,t,s,cnt,clo,scc,top,ans;int rhead[maxn],head[maxn],in[maxn],pr[maxn],bel[maxn],vis[maxn],low[maxn],q[maxn],w[maxn],dis[maxn];void add(int u,int v){e[cnt]=(edge){v,head[u]},head[u]=cnt++;}void radd(int u,int v){re[cnt]=(edge){v,rhead[u]},rhead[u]=cnt++;}void dfs(int u){vis[u]=low[u]=clo++;q[++top]=u;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;if(!vis[v]) dfs(v),low[u]=min(low[u],low[v]);else if(!bel[v]) low[u]=min(low[u],vis[v]);}if(low[u]==vis[u]){scc++;while(q[top+1]!=u) bel[q[top--]]=scc;}}void spfa(){for(int i=1;i<=scc;i++) dis[i]=vis[i]=0;int he=0,ta=1;q[0]=bel[s];vis[bel[s]]=1;dis[bel[s]]=w[bel[s]];while(he!=ta){int u=q[he++];he%=maxn;vis[u]=0;for(int i=rhead[u];i!=-1;i=re[i].next){int v=re[i].v;if(dis[v]<dis[u]+w[v]) {dis[v]=dis[u]+w[v];if(!vis[v]) vis[v]=1,q[ta++]=v,ta%=maxn;}}}}int main(){scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));for(int i=0,u,v;i<m;i++) scanf("%d%d",&u,&v),add(u,v);for(int i=1;i<=n;i++) scanf("%d",&pr[i]);scanf("%d%d",&s,&t);memset(in,0,sizeof(in));for(int i=1,u;i<=t;i++) scanf("%d",&u),in[u]=1; for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);for(int i=1;i<=n;i++) w[bel[i]]+=pr[i];cnt=0;memset(rhead,-1,sizeof(rhead));for(int u=1;u<=n;u++) for(int i=head[u],v;i!=-1;i=e[i].next)if(bel[u]!=bel[v=e[i].v]) radd(bel[u],bel[v]); spfa();for(int i=1;i<=n;i++) if(in[i]) ans=max(ans,dis[bel[i]]);printf("%d\n",ans);return 0;}


0 0