HDU 1827 Summer Holiday(Tarjan缩点)[通俗易懂]

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真是高兴的夜不能寐啊。他想着得快点把这消息告诉大家。尽管他手上有全部人的联系方式。可是一个一个联系过去实在太耗时间和电话费了。他知道其它人也有一些别人的联系方式。这样他能够通知其它人,再让其它人帮忙通知一下别人。你能帮Wiskey计算出至少要通知多少人,至少得花多少电话费就能让全部人都被通知到吗?

 


Input
多组測试数组,以EOF结束。

第一行两个整数N和M(1<=N<=1000, 1<=M<=2000),表示人数和联系对数。

接下一行有N个整数,表示Wiskey联系第i个人的电话费用。

接着有M行。每行有两个整数X,Y。表示X能联系到Y,可是不表示Y也能联系X。

 


Output
输出最小联系人数和最小花费。

每一个CASE输出答案一行。

 


Sample Input
   
   
12 16 2 2 2 2 2 2 2 2 2 2 2 2 1 3 3 2 2 1 3 4 2 4 3 5 5 4 4 6 6 4 7 4 7 12 7 8 8 7 8 9 10 9 11 10

 


Sample Output
   
   
3 6
题意:中文
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
typedef long long LL;
using namespace std;
const int INF=0x3f3f3f;

#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a , x ) memset ( a , x , sizeof a )

const int maxn=1100;
const int maxm=10000;
struct node{
    int u,v;
    int next;
}e[maxm];
int head[maxn],cntE;
int DFN[maxn],low[maxn];
int s[maxm],top,index,cnt;
int belong[maxn],instack[maxn];
int in[maxn],val[maxn];
int tt[maxn];//tt保存缩成的点中的最小值
int n,m;
void init()
{
    top=cntE=0;
    index=cnt=0;
    CLEAR(DFN,0);
    CLEAR(head,-1);
    CLEAR(instack,0);
}
void addedge(int u,int v)
{
    e[cntE].u=u;e[cntE].v=v;
    e[cntE].next=head[u];
    head[u]=cntE++;
}
void Tarjan(int u)
{
    DFN[u]=low[u]=++index;
    instack[u]=1;
    s[top++]=u;
    for(int i=head[u];i!=-1;i=e[i].next)
    {
        int v=e[i].v;
        if(!DFN[v])
        {
            Tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(instack[v])
            low[u]=min(low[u],DFN[v]);
    }
    int v;
    if(DFN[u]==low[u])
    {
        cnt++;
        do{
            v=s[--top];
            belong[v]=cnt;
            instack[v]=0;
        }while(u!=v);
    }
}
void work()
{
    REPF(i,1,n)
      if(!DFN[i])  Tarjan(i);
    CLEAR(in,0);
    CLEAR(tt,INF);
    REPF(i,1,n)
    {
        if(tt[belong[i]]>val[i])
            tt[belong[i]]=val[i];
    }
    REPF(k,1,n)
    {
        for(int i=head[k];i!=-1;i=e[i].next)
        {
            int v=e[i].v;
            if(belong[k]!=belong[v])
               in[belong[v]]++;
        }
    }
    int ans=0;
    int num=0;
    REPF(i,1,cnt)
    {
        if(!in[i])
        {
            num++;
            ans+=tt[i];
        }
    }
    printf("%d %d\n",num,ans);
}
int main()
{
    int u,v;
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(int i=1;i<=n;i++)
            scanf("%d",&val[i]);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            addedge(u,v);
        }
        work();
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115806.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月30日 下午12:00
下一篇 2022年1月30日 下午1:00


相关推荐

  • java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]

    java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]java语言是开发前端还是后端的发布时间:2020-06-2616:01:18来源:亿速云阅读:105作者:Leahjava语言是开发前端还是后端的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java不是前端,是后端。Java语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程的能力,且体系结构比较中…

    2022年7月7日
    20
  • Centos7根分区lvm扩容

    Centos7根分区lvm扩容给根分区/dev/mapper/cl-root扩容20G空间1、先创建一个分区,并把其调整为8eLVM存储卷格式#重读分区表或重启服务器[root@rsq-8-163~]#partprobe#格式化新分区之前先查看根分区是什么文件系统[root@rsq-8-163~]#mount|grep/dev/mapper/cl-root/dev/mapper/cl-r…

    2022年6月20日
    35
  • redis配置文件中常用配置详解[通俗易懂]

    redis配置文件中常用配置详解[通俗易懂]此次安装的版本为:5.0.3[root@localhostlocal]#redis-server–versionRedisserverv=5.0.3sha=00000000:0malloc=jemalloc-5.1.0bits=64build=afabdecde61000c3打开redis.cof###############################…

    2022年6月14日
    36
  • mybatiscodehelperpro激活码【中文破解版】

    (mybatiscodehelperpro激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html83…

    2022年3月22日
    35
  • 多重共线性检验之方差膨胀因子VIF[通俗易懂]

    多重共线性检验之方差膨胀因子VIF[通俗易懂]过程1、构造每一个自变量与其余自变量的线性回归模型,例如,数据集中含有p个自变量,则第一个自变量与其余自变量的线性组合可以表示为2、根据如上线性回归模型得到相应的判决系数R2R^2R2,进而计算第一个自变量的方差膨胀因子VIF:importpandasaspdimportnumpyasnpfromsklearnimportmodel_selectionimportstatsmodels.apiassnfromstatsmodels.stats.outlier

    2022年6月6日
    249
  • 2021数模美赛A题翻译及思路

    2021数模美赛A题翻译及思路A题懒得看了,不占坑了,可以去看看我EF的思路(还在占坑)问题A:菌类2021美赛A题思路。2021美赛A题解法。2021美赛思路,2021美赛数学建模思路,欢迎加入秀儿为你弹奏东风破:752899821碳循环描述了整个地球地球化学循环中碳交换的过程,是地球生命的重要组成部分。碳循环的一部分包括化合物的分解,使碳得以更新并以其他形式使用。该过程的这一部分的关键组成部分是植物材料和木质纤维的分解。分解木质纤维的一些关键因素是真菌。最近关于真菌通过木材分解的研究文章的作者确定了决定分解速率的真菌性状,并

    2022年5月7日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号