【练习】HDU 1827 Summer Holiday (强连通分量+缩点)

题意

给定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];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值