杭电1827--Summer Holiday(SCC + 缩点)

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

第二道强连通分量题目, 对于SCC也有了一定的认识, 所以想在这里总结一下;有向非强连通图的极大强连通子图叫做强连通分量 (SCC), 所有强连通分量在原图中组成一个DAG(每个强连通分量看作一个点)。TarJan() 算法利用Dfs找强连通分量, 我们可以把Dfs搜索过程看作是一个整体,个人感觉分步模拟并不是很好理解。

Low[]: 时间戳;(树根)。

dfn[]; 记录搜索当前节点的时间。

当搜索到强连通分量时, 让根节点及其以上节点弹出栈。(instack[u] = 0)。可以进行操作是记录SCC个数 && 缩点 && 记录SCC中结点的个数。

本题题意是在一个有向关系图中, 花最少的话费, 把消息通知到所有人。
看SCC入度 V, V!= 0 不需花费, V == 0, 取花费最少节点, 注意操作一致性。

#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
int dfn[1001], low[1001], instack[1001], sccf[1001], Rdu[1001], Cost[1001], cnt_SCC, vis_num, total, n, m;
struct Edge
{
    int from, to, next;
} edge[2010];
int cnt, head[1001];
void Add(int a, int b)
{
    Edge E = {a, b, head[a]};
    edge[cnt] = E;
    head[a] = cnt++;
}
stack<int> S;
void TarJan(int x)
{
    int j;
    dfn[x] = low[x] = ++vis_num;
    instack[x] = 1;
    S.push(x);
    for(int  i = head[x]; i != -1; i = edge[i].next)
    {
        int u = edge[i].to;
        if(dfn[u] == -1)
        {
            TarJan(u);
            if(low[x] > low[u])
                low[x] = low[u];
        }
        else if(instack[u] && low[x] > dfn[u])
            low[x] = dfn[u];
    }
    if(low[x] == dfn[x])
    {
        cnt_SCC++;
        do{
            j = S.top();
            sccf[j] = cnt_SCC;
            S.pop();
            instack[j] = 0;
        }
        while(j != x);
    }
}
void Deal()   //确定结果;
{
    for(int i = 1; i <= n; i++)
    {
        for(int k = head[i]; k != -1; k = edge[k].next)
        {
            int u = edge[k].to;
            if(sccf[u] != sccf[i])
                Rdu[sccf[u]]++;
        }
    }
    int ReSult = 0;
    for(int i = 1; i <= cnt_SCC; i++)
    {
        if(!Rdu[i])
        {
            ReSult++;
            int minn = INF;
            for(int j = 1; j <= n; j++)
            {
                if(sccf[j] == i)
                    minn = min(minn, Cost[j]);
            }
            total += minn;
        }
    }
    printf("%d %d\n", ReSult, total);
}
void SolVe()
{
    vis_num = cnt_SCC = total = 0;
    for(int i = 1; i <= n; i++)
        if(dfn[i] == -1)
            TarJan(i);
//    printf("%d\n", cnt_SCC);
}
void GetMap()
{
    memset(Rdu, 0, sizeof(Rdu));
    memset(low, 0, sizeof(low));
    memset(dfn, -1, sizeof(dfn));
    memset(head, -1, sizeof(head));
    memset(instack, 0, sizeof(instack));

    cnt = 0;
    for(int i = 1; i <= m; i++)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        Add(a, b);
    }
}
int main()
{
    while(~scanf("%d %d", &n, &m))
    {
        for(int i = 1; i <= n; i++)
            scanf("%d", &Cost[i]);

        GetMap();
        SolVe();
        Deal();
    }
    return 0;
}
时间: 2024-11-19 18:09:30

杭电1827--Summer Holiday(SCC + 缩点)的相关文章

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真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间和电话

hdoj 1827 Summer Holiday【强连通分量&amp;&amp;缩点】

Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2256    Accepted Submission(s): 1050 Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Inf

HDU 1827 Summer Holiday(强连通)

HDU 1827 Summer Holiday 题目链接 题意:中文题 思路:强连通缩点,每个点的权值为强连通中最小值,然后入度为0的点就是答案 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> #include <stack> using namespace std; const int N = 1005; const int INF

ACM 五一杭电赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛小记

对于这项曾经热爱的竞赛,不得不说这是我最后一年参加ACM比赛了,所以要珍惜每一次比赛的机会. 五一去杭电参加了赛码"BestCoder"杯中国大学生程序设计冠军赛,去的队伍包括了今年19支World final的队伍,几乎是全国最强的46所学校各出了一个代表队,十分感谢学校给了我这个大三的老年血手这次去比赛的机会. 比赛在5.2一天内完成,上午的热身赛居然是上一场Bestcoder的原题= =.虽然我们三个人都没做过...不过我还是水水的写了前两道题. 在中午的悲惨淋雨后,下午正赛开始

杭电 HDU 1164 Eddy&#39;s research I

Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7117    Accepted Submission(s): 4268 Problem Description Eddy's interest is very extensive, recently  he is interested in prime

hdu 1016 Prime Ring Problem DFS解法 纪念我在杭电的第一百题

Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29577    Accepted Submission(s): 13188 Problem Description A ring is compose of n circles as shown in diagram. Put natural num

杭电ACM分类

杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDIATE DECODABILITY

一个人的旅行 HDU杭电2066【dijkstra算法】

http://acm.hdu.edu.cn/showproblem.php?pid=2066 Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女--眼看寒假就快到了,这么一大段时间,可不

杭电1162--Eddy&#39;s picture(Prim()算法)

Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8070    Accepted Submission(s): 4084 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to b