http://acm.hdu.edu.cn/showproblem.php?pid=1827

思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#include <stack>
using namespace std;
#define N 80010
#define M 30010
#define INF 0x3f3f3f3f
struct node
{
int u, v, next;
}edge[N*];
stack<int> sta;
int tot, cnt, num, head[N], belong[N], dfn[N], low[N], n, m, a[N], in[N], mi[N];
bool vis[N]; void init()
{
tot = cnt = num = ;
while(sta.size()) sta.pop();
memset(head, -, sizeof(head));
memset(belong, , sizeof(belong));
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(vis, false, sizeof(vis));
memset(in, , sizeof(in));
memset(mi, INF, sizeof(mi));
} void add(int u, int v)
{
edge[tot].u = u; edge[tot].v = v; edge[tot].next = head[u]; head[u] = tot++;
} void tarjan(int u)
{
vis[u] = ;
sta.push(u);
dfn[u] = low[u] = ++cnt;
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v;
if(!dfn[v]) {
tarjan(v);
if(low[v] < low[u]) low[u] = low[v];
} else if(vis[v]) {
if(dfn[v] < low[u]) low[u] = dfn[v];
}
}
if(dfn[u] == low[u]) {
++num;
int top = -;
while(top != u) {
top = sta.top(); sta.pop();
belong[top] = num;
vis[top] = ;
}
}
} int main()
{
while(~scanf("%d%d", &n, &m)) {
init();
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
}
for(int i = ; i <= n; i++)
if(!dfn[i]) tarjan(i);
for(int u = ; u <= n; u++) {
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v;
if(belong[u] != belong[v]) { //缩点后找入度为0的点
in[belong[v]]++;
}
}
}
int ans = , sum = ;
for(int i = ; i <= num; i++) {
if(!in[i]) {
ans++;
for(int j = ; j <= n; j++) {
if(belong[j] == i) {
if(a[j] < mi[i]) {
mi[i] = a[j]; //对于不同的强连通分量之间找耗费最小的入口
}
}
}
sum += mi[i];
}
}
printf("%d %d\n", ans, sum);
}
return ;
} /*
4 3
1 2 3 4
1 2
1 3
1 4
*/

HDU 1827:Summer Holiday(强连通)的更多相关文章

  1. HDU - 1827 Summer Holiday (强连通)

    <题目链接> 题目大意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间 ...

  2. HDU 1827 Summer Holiday(强连通)

    HDU 1827 Summer Holiday 题目链接 题意:中文题 思路:强连通缩点,每一个点的权值为强连通中最小值,然后入度为0的点就是答案 代码: #include <cstdio> ...

  3. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. HDU 1827 Summer Holiday

    http://acm.hdu.edu.cn/showproblem.php?pid=1827 题意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家 ...

  5. 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 ...

  6. [tarjan] 1827 Summer Holiday

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1827 Summer Holiday Time Limit: 10000/1000 MS (Java/ ...

  7. Tarjan系列算法总结(hdu 1827,4612,4587,4005)

    tarjan一直是我看了头大的问题,省选之前还是得好好系统的学习一下.我按照不同的算法在hdu上选题练习了一下,至少还是有了初步的认识.tarjan嘛,就是维护一个dfsnum[]和一个low[],在 ...

  8. HDU 1827 强连通 缩点 Summer Holiday

    求出强连通分量,因为强连通中只要有一个人被通知到了,所有人都能被通知到. 缩点以后形成一个DAG,找出那些入度为0的点,累加上它们的权值就是答案.一个点的权值等于SCC中权值最小的那个点. #incl ...

  9. 强连通 HDU 1827

    n个点m条边 n个权lcy 要叫这个人的花费 m条边 缩点后 新的图中 入度为0的点要通知  通知强连通分量中权值最小的 #include<stdio.h> #include<alg ...

随机推荐

  1. windows下统计代码量

    windows 工具 1.exe程序 http://blog.csdn.net/hui1502/article/details/51191678 https://sourceforge.net/pro ...

  2. hibernate主键生成机制与save返回

    主键生成机制为assigned时,save之后通过get得不到id(主键),使用identity可以. hibernate主键生成机制1) assigned主键由外部程序负责生成,无需Hibernat ...

  3. java io读书笔记(3)数值类型的数据

    input stream读取字节:out stream写入字节.Readers读取字符而Writers写入字符.因此,如果我们想理解input和output,我们首先就要明白 java如何处理字节,整 ...

  4. SQL between查询 范围查询

    --sal为员工工资 select * from emp;

  5. UI design principles

    Master's conclusion: 1. fix a color pattern 2. fix the frames the UI will use 3. fix the subject tha ...

  6. eclipse批量删除断点(转)

    1.首先调出BreakPoints选项卡(Window--show View--Other--BreakPoints). 2.选择BreakPoints选项卡,选择所有断点,点击删除即可. 

  7. C++之路起航——标准模板库(set)

    set(集合):http://baike.baidu.com/link?url=cb68AB-3qfEK8RoaGHJFClb4ZiWpJfc32lPOLtaNUrdxntFC738zCZsCiUlf ...

  8. cocos2d-x游戏开发之动画

    MyGame.h中声明动画函数: class MyGame : public cocos2d::Layer{public: static Scene* createScene();    void U ...

  9. docker 批量删除容器

     docker rm `docker ps -a |awk '{print $1}' | grep [0-9a-z]`

  10. 关于 VS 无法转到定义和无法转到使用的问题

    今天提交完代码以后突然发现  咦  怎么F12 .点击右键的方法都不能转到定义了    转到引用 也提示  没有发现   重启VS  还是不行 .去找王晓  他也不清楚(其实我知道 他应该也不清楚  ...