题目链接:
https://www.luogu.org/problem/P3387
一:ac思路
参考博客:
https://www.luogu.org/blog/wyz598085788/solution-p3387
思路:
1:在用tarjan缩点时,用num[cnt]记录每一个强连通分量的值
2:核心思路:虚拟头节点f和虚拟尾节点t
3:就是经过tarjan缩点之后,把每一个强连通分量看作一个节点建图,然后把每一个强连通分量的负值当作该边的权值
4:以f为起点,t为终点跑spfa
5:用虚拟头节点f和每一个节点建一条边,权值为-num[i],每一个节点和虚拟尾节点建一条边,权值为0
int f=0;
int t=cnt+1;
for(int i=1;i<=cnt;i++)
{
mapp[f].push_back(make_pair(i,-num[i]));
mapp[i].push_back(make_pair(t,0));
}
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+1;
vector<int>e[maxn];
set<int>ee[maxn];
int dfn[maxn],low[maxn],ins[maxn],color[maxn],timing,cnt,n,m,id[maxn];
int num[maxn],point[maxn];
stack<int>s;
vector<pair<int,int> >mapp[maxn];
int d[maxn],ing[maxn];
void tarjan(int x)
{
low[x]=dfn[x]=++timing;
s.push(x);
ins[x]=1;
for(int i=0;i<e[x].size();i++)
{
int v=e[x][i];
if(!dfn[v])
{