要跑最长路 记搜超时
/************************************************************** Problem: 1179 User: lxy8584099 Language: C++ Result: Accepted Time:7020 ms Memory:58476 kb****************************************************************/ /* 缩点后dfs 途中更新答案 */#include#include #include 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 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]