强连通分量——tarjin算法;

这题的思路就是找出多少个出度为0的连通分量,结果就是这些连通分量的元素的最小值相加;

一道很简单的题,改了我好久,= =!~

贴代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<vector>
#define maxn 1005
using namespace std; int dfn[maxn],low[maxn],pen[maxn],b[maxn];
int nncount,ans,cc[maxn],cnt,in[maxn];
bool instack[maxn];
vector<int>ve[maxn];
stack<int>s; void tarjin(int x)
{
dfn[x]=low[x]=++nncount;
instack[x]=;
s.push(x);
int l=ve[x].size();
for(int i=; i<l; i++)
{
int v=ve[x][i];
if(!dfn[v])
{
tarjin(v);
low[x]=min(low[v],low[x]);
}
else if(instack[v])
low[x]=min(low[x],dfn[v]);
}
if(dfn[x]==low[x])
{
cnt++;
int t;
do
{
t=s.top();
s.pop();
b[t]=cnt;
instack[t]=;
}
while(t!=x);
}
} int main()
{
int n,m,x,y,sum;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(low,,sizeof low);
memset(b,,sizeof b);
memset(dfn,,sizeof dfn);
memset(in,,sizeof in);
memset(cc,,sizeof cc);
memset(instack,,sizeof instack);
nncount=ans=sum=cnt=;
for(int i=; i<=n; i++)
{
scanf("%d",&pen[i]);
ve[i].clear();
}
while(!s.empty()) s.pop();
for(int i=; i<m; i++)
{
scanf("%d%d",&x,&y);
ve[x].push_back(y);
}
for(int i=; i<=n; i++)
if(!dfn[i])
tarjin(i);
for(int i=; i<=n; i++)
{
int l=ve[i].size();
for(int j=; j<l; j++)
{
int v=ve[i][j];
if(b[i]!=b[v]) in[b[v]]++;
}
}
for(int i=; i<=cnt; i++)
{
if(in[i]==)ans++;
cc[i]=;
}
for(int i=; i<=n; i++)
{
int v=b[i];
if(in[v]==) cc[v]=min(cc[v],pen[i]);
}
for(int i=; i<=cnt; i++)
if(cc[i]!=)
sum+=cc[i];
printf("%d %d\n",ans,sum);
}
return ;
}

hdu 1827的更多相关文章

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

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

  2. HDU 1827 Summer Holiday(强连通)

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

  3. HDU 1827:Summer Holiday(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=1827 思路:强连通分量缩点后找入度为0的点,然后对于属于该强连通分量的找一个最小耗费的入口. #include ...

  4. HDU 1827 Summer Holiday

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

  5. 强连通 HDU 1827

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

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

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

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

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

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

  9. HDU 1827 强连通 缩点 Summer Holiday

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

随机推荐

  1. Java基础知识强化之集合框架笔记69:Collections类之ArrayList存储自自定义对象并排序的案例

    1. ArrayList存储自自定义对象并排序的案例: ArrayList存储自自定义对象,并使用Collections对ArrayList存储基本包装类的元素排序. 2. 代码实现: (1)Stud ...

  2. Linux common resources

    Useful Linux Web reources list Linux die manual Linux Man Pages Archive Linux RPM find Linux RPM Sea ...

  3. group by java实现

    public static void abc(List list,String... sortName) throws Exception{ Map<String,List<Object& ...

  4. Android屏幕适配全攻略(最权威的官方适配指导)

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入 ...

  5. 关于添加非系统framework后,import导入头文件时没有提示的解决办法

    ##1.选择target(就是左边你的工程target)—— BuildSettings —— search Paths 下的 User Header Search Paths(如图所示: ##2.双 ...

  6. objective-c中是如何实现线程同步的?

    多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线 ...

  7. 注册一个比较大小Handlebars

    1.显示的数据 var datas = { id:"number" } 2.temp模板 <script id="template" type=" ...

  8. java Email发送及中文乱码处理。

    public class mail { private String pop3Server=""; private String smtpServer=""; ...

  9. 根据id设置、获取元素的文本和value

    /** * 根据id获取元素文本 * @param {String} id|元素id * return {Integer || String} text */function getText(id){ ...

  10. 用crontab、crond在嵌入式系统中添加定时任务

    在嵌入式系统中,定时任务通过crond和cronttab两个系统命令来联合执行. 其中crond是定时任务的守护进程,系统开始时是没有开启的.crontab主要作用是管理用户的crontab file ...