题意:
给定n个点 m条有向边的图
每个点的点权
问:
遍历一遍图能得到的最大点权(对于经过的点,可以选择是否获得该点点权,但每个点只能被获得一次)
起点可以任意。
思路:
我们把有向图缩点为有向的缩点树,则某一强连通块的权值就是该连通块下的 所有正点权值和
这样我们就可以得到一个有向无环图,显然我们选择的起点是入度为0 的点,因为所有入度不为0的点 都能从别的点走过来。
因此我们建立虚根连接所有入度为0的点,然后跑一遍最长路spfa。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define inf 1000000
#define N 30100
//N为点数
#define M 150100
//M为边数
int n, m, a[N], val[N];
struct Edge{
int from, to, nex;
bool sign;//是否为桥
}edge[M<<1];
int head[N], edgenum;
void add(int u, int v){
Edge E={u, v, head[u], false};
edge[edgenum] = E;
head[u] = edgenum++;
}
int DFN[N], Low[N], Stack[N], top, Time;
int taj;//连通分支标号,从1开始
int Belong[N];//B