题意
给定N个人,M条关系(N <=1000, M<= 2000),,如果a到b有边则表示第a个人能够联系到第b个人,联系第i个人的花费为v[i],联系具有传递性。现在需要联系到所有人,求最小联系人数和最小花费。
题解
考虑使用tarjan算法求解出所有强连通分量,然后强连通分量缩点(染色),然后考虑最小花费。自然想到如果一个部分(点)没有人指向它,那么一定要通知他,也就对应图中的入度。若一个连通分量入度为0,则一定要选中这个连通分量,并且自然选择这个连通分量中花费最小的。
可以在Tarjan的规程中,求出每个连通分量连通的最小花费。对缩点的图进行一次dfs,求出入度,最后统计答案即可。
代码
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
typedef unsigned long long ull;
const int nmax = 2005;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const ull p = 67;
const ull MOD = 1610612741;
int N,M;
int cost[1005];