题意:有向有环图,求最长路(每个点权值仅算一次)
做法:1.scc缩点,建立scc图 2.求scc图最长路(spfa)
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#define ll long long
#define sf scanf
#define pf printf
#define maxn 50*50
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x&(-x)
const ll mod=1000000007;
using namespace std;
int t,n,m;
char ma[maxn][maxn];
int ore[maxn];
stack<int> S;
vector<int> sccg[maxn];
int d[maxn];
struct Edge{
int to,next;
}edge[maxn*maxn];
int head[maxn],tot,scc_cnt,dfs_clock,pre[maxn],low[maxn],sccno[maxn],sum[maxn];
void add(int u,int v){
edge[tot].to=v,edge[tot].next=head[u],head[u]=tot++;
}
void dfs(int u){
pre[u]=low[u]=++dfs_clock;
S.push(u);