要跑最长路 记搜超时
/************************************************************** Problem: 1179 User: lxy8584099 Language: C++ Result: Accepted Time:7020 ms Memory:58476 kb ****************************************************************/ /* 缩点后dfs 途中更新答案 */ #include<queue> #include<cstdio> #include<cstring> using namespace std; const int N=500050; struct pp {int u,v,nxt;} e[N]; int head[N],tot,n,m,o,a[N],st,maxn; int sta[N],dfn[N],low[N],top,fa[N],dis[N]; bool vis[N],bar[N]; void add(int u,int v) { e[++tot].nxt=head[u],head[u]=tot; e[tot].v=v;e[tot].u=u; } int min(int a,int b) {return a>b?b:a;} int max(int a,int b) {return a>b?a:b;} void tarjan(int u) { vis[u]=1;sta[++top]=u; dfn[u]=low[u]=++tot; for(int j=head[u];j;j=e[j].nxt) { int v=e[j].v; if(!dfn[v]) { tarjan(v);low[u]=min(low[u],low[v]); } else if(vis[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]) { // printf("______________________________________\n"); int x; do { x=sta[top--];vis[x]=0;fa[x]=u;bar[u]|=bar[x]; // printf("%d\n",x); if(x!=u) a[u]+=a[x]; }while(x!=u); } } void spfa() { queue<int> q;q.push(st); dis[st]=a[st]; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int j=head[u];j;j=e[j].nxt) { int v=e[j].v; if(dis[v]<dis[u]+a[v]) { dis[v]=dis[u]+a[v]; if(!vis[v]) vis[v]=1,q.push(v); } } } } int main() { scanf("%d%d",&n,&m); for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),add(u,v); for(int i=1;i<=n;i++) scanf("%d",&a[i]),fa[i]=i; scanf("%d%d",&st,&o); tot=0; for(int i=1,x;i<=o;i++) scanf("%d",&x),bar[x]=1; tarjan(st); tot=0; memset(head,0,sizeof(head)); for(int i=1;i<=m;i++) { int u=fa[e[i].u],v=fa[e[i].v]; if(u==v) continue; add(u,v); // printf("%d %d\n",u,v); } spfa(); for(int i=1;i<=n;i++) if(fa[i]==i&&bar[i]) maxn=max(maxn,dis[i]); printf("%d\n",maxn); return 0; }