【题解】
在遍历的时候做标记,如果有罪犯既不能揭发也不能被揭发,则无解。否则输出每个强连通分量的最小花费之和即可。
【代码】
#include<bits/stdc++.h>
using namespace std;
#define maxn 3005
#define maxm 8005
#define inf 0x3f3f3f3f
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
int cost[maxn],sum[maxn];
struct Edge{
int to,next;
}edge[maxm];
int n,cnt=0,head[maxn];
int low[maxn],dfn[maxn],Stack[maxn],belong[maxn],in[maxn];
bool instack[maxn];
int pos=0,top=0,scc=0;
int num[maxn];
void add(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
void tarjan(int u)
{
low[u]=dfn[u]=++pos;
Stack[++top]=u;
instack[u]=true;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])
low