拿到题目首先想到:一个强连通分量里的点都可以互相走到
所以我们先缩点
缩完点后只需用spfa跑一遍最长路 最后再统计一下有哪些含有酒吧的强连通分量 取最大值
就是代码有点冗长
#include<bits/stdc++.h> #define N 500005 #define INF 0x7fffffff using namespace std; struct Edge { int to,next; }edge[N]; int n,m,first[N],tot,val[N]; int s,p; bool is_bar[N],have_bar[N]; inline void addedge(int x,int y) { tot++; edge[tot].to=y; edge[tot].next=first[x]; first[x]=tot; } int dfn[N],low[N],sign,cnt,belong[N],sum[N]; bool insta[N]; stack <int> sta; void dfs(int now) { dfn[now]=low[now]=++