hdu1827Summer Holiday tarjan缩点

//给一个有向图,每个点都有权值,问最少需要几个起点和最少花费多少能将整个图遍历完

//用tarjan缩点,然后找出所有入度为0的点

#include<cstdio>

#include<cstring>

#include<iostream>

#include<vector>

using namespace std ;

const int maxn = 1010 ;

const int inf = 0x7fffffff ;

vector<int> vec[maxn] ;

int num = 0 ;

int step = 0 ;int top ;

int dfn[maxn] , low[maxn] ;

int isstack[maxn] ;

int stack[maxn] ;

int belong[maxn] ;

int value[maxn] ;

int vis[maxn] ;

int degree[maxn] ;

int mi[maxn] ;

void init()

{

num = step = top = 0 ;

memset(isstack , 0 , sizeof(isstack)) ;

memset(dfn , 0 , sizeof(dfn)) ;

memset(low , 0 , sizeof(low)) ;

memset(vis , 0 , sizeof(vis)) ;

memset(degree , 0 , sizeof(degree)) ;

for(int i = 0;i < maxn;i++)

vec[i].clear() ;

}

void tarjan(int u)

{

vis[u] = 1 ;

stack[++top] = u ;

isstack[u] = 1;

dfn[u] = low[u] = ++step ;

for(int i = 0;i < vec[u].size() ;i++)

{

int v = vec[u][i] ;

if(!dfn[v])

{

tarjan(v) ;

low[u] = min(low[u] , low[v]) ;

}

else if(isstack[v])

low[u] = min(low[u] , dfn[v]) ;

}

if(low[u] == dfn[u])

{

int v = 0 ;

num++ ;

mi[num] = inf ;

while(u!=v)

{

v = stack[top--] ;

belong[v] = num ;

mi[num] = min(mi[num] , value[v]) ;

isstack[v] = 0 ;

}

}

}

int main()

{

//freopen("in.txt" ,"r" , stdin) ;

int  n , m ;

while(~scanf("%d%d" , &n , &m))

{

for(int i = 1;i <= n;i++)

scanf("%d" , &value[i]) ;

int a , b ;

init() ;

for(int i = 1;i <= m;i++)

{

scanf("%d%d" ,&a , &b) ;

vec[a].push_back(b) ;

}

for(int i = 1;i <= n;i++)

if(!vis[i])tarjan(i) ;

int sum = 0 ;

int ans = 0 ;

for(int i = 1;i <= n;i++)

{

for(int j = 0;j < vec[i].size() ;j++)

{

if(belong[vec[i][j]] != belong[i])

degree[belong[vec[i][j]]] = 1;

}

}

for(int i = 1;i <= num;i++)

if(!degree[i])

{

sum++ ;

ans += mi[i] ;

}

printf("%d %d\n" , sum , ans) ;

}

return  0 ;

}

时间: 2024-08-26 17:02:45

hdu1827Summer Holiday tarjan缩点的相关文章

hdu 1827 Summer Holiday tarjan+缩点

题意:http://acm.hdu.edu.cn/showproblem.php?pid=1827 Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2050    Accepted Submission(s): 939 Problem Description To see a World in a Gra

HDU 1827 Summer Holiday(Tarjan缩点)

Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity in the palm of your hand And Eternity in an hour. -- William Blake 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话

HDU1827Summer Holiday (强连通,缩点,最小费用)

Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity in the palm of your hand And Eternity in an hour. -- William Blake 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话

【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Status][Discuss] Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意

【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点

1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1685  Solved: 724[Submit][Status][Discuss] Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么中转站vi可以通过该道路到达ui中转站,如果切断这条道路,需要代价ci.现在B国想找出一个路径切断方案

[BZOJ 1051][HAOI 2006]受欢迎的牛(tarjan缩点)

http://www.lydsy.com:808/JudgeOnline/problem.php?id=1051 唔...这题好像在POJ上见过? 比较水的题,很好想出思路.牛和牛之间的关系就像有向图,牛a喜欢牛b相当于建立有向边a->b,然后在这个有向图中,每个强连通分量里的牛们相当于是相互喜欢的,把这个图缩点成DAG,DAG里如果有且仅有一个出度为0的点,则这个点对应强连通分量里的所有牛都是受欢迎的牛,如果没有出度为0的点,当然就没受欢迎的牛了,如果出度为0的点的个数大于1,则每个出度为0的

tarjan缩点以及链式前向星的基本+应用(洛谷1262 间谍网络)

题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子.因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报. 我们的反间谍机关提供了一份资料,色括所有已知的受贿的间谍,以及他们愿意收受的具体数额.同时我们还知道哪些间谍手中具体掌握了哪些

【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率

2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1638  Solved: 433[Submit][Status][Discuss] Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是杀手, 谁是平民. 假如查证的对象是杀手, 杀手将会把警察干掉. 现在警察掌

UVA11504- Dominos(Tarjan+缩点)

题目链接 题意:多米诺骨牌的游戏,给出一些牌,以及哪张牌倒了之后会推倒哪张牌,求最少的推倒牌的张数,使得所有牌都倒下去. 思路:有向图的强连通分量,用Tarjan缩点之后找出入度为0的点的个数,即为答案. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 100100;