1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| #include<stdio.h> #include<iostream> #include<algorithm> #include<stack> #include<cstring> #include<vector> #define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; const int MAXN=500020; const int MAXM=500020; int n,m,idx,cnt,g[MAXN]; int dfn[MAXN],low[MAXN]; bool instack[MAXN]; struct E{ int u,v,nex; bool operator<(const E x)const{ if(u==x.u) return v<x.v; return u<x.u; } bool operator==(const E x)const{ return u==x.u&&v==x.v&&nex==x.nex; } }e[MAXM]; stack<int>s; vector<int>belong[MAXN]; int p2p[MAXN]; void Tarjan(int u){ dfn[u]=low[u]=++idx; s.push(u); instack[u]=true; for(int i=g[u];i>0;i=e[i].nex){ int v=e[i].v; if(!dfn[v]){ Tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]){ low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u]){ ++cnt; int cur; do{ cur=s.top();s.pop(); instack[cur]=false; belong[cnt].push_back(cur); p2p[cur]=cnt; }while(cur!=u); } } int money[MAXN]; int jiub[MAXN]; int st,num; int nn; int new_money[MAXN]; int dp[MAXN]; int du[MAXN]; void dfs(int u){ for(int i=g[u];i>0;i=e[i].nex){ int v=e[i].v; du[v]--; dp[v]=max(dp[v],dp[u]+new_money[v]); if(du[e[i].v]==0){ dfs(e[i].v); } } } int main(){ io_opt; cin>>n>>m; int x,y; for(int i=1;i<=m;i++){ cin>>x>>y; e[i]=(E){x,y,g[x]};g[x]=i; } for(int i=1;i<=n;i++){ cin>>money[i]; } cin>>st>>num; for(int i=1;i<=num;i++){ cin>>jiub[i]; } Tarjan(st); for(int i=1;i<=m;i++){ int u=e[i].u,v=e[i].v; if(!p2p[u]||!p2p[v]||p2p[u]==p2p[v]){ e[i].u=e[i].v=1000000; e[i].nex=1000000; } else{ e[i].u=p2p[u]; e[i].v=p2p[v]; e[i].nex=0; } } for(int i=1;i<=cnt;i++){ for(int j=0;j<belong[i].size();j++){ new_money[i]+=money[belong[i][j]]; } } sort(e+1,e+1+m); nn=unique(e+1,e+1+m)-(e+1); while(e[nn].nex==1000000) nn--;
memset(g,0,sizeof(g)); for(int i=1;i<=nn;i++){ e[i].nex=g[e[i].u]; g[e[i].u]=i; du[e[i].v]++; }
dp[p2p[st]]=new_money[p2p[st]]; dfs(p2p[st]); int ans=0; for(int i=1;i<=num;i++){ ans=max(ans,dp[p2p[jiub[i]]]); } cout<<ans<<endl; return 0; }
|