hdu1827之强联通
Summer Holiday
Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1430 Accepted Submission(s): 645
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计算出至少要通知多少人。至少得花多少电话费就能让全部人都被通知到吗?
第一行两个整数N和M(1<=N<=1000, 1<=M<=2000)。表示人数和联系对数。
接下一行有N个整数,表示Wiskey联系第i个人的电话费用。
接着有M行,每行有两个整数X,Y,表示X能联系到Y,可是不表示Y也能联系X。
每一个CASE输出答案一行。
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
3 6
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std; const int MAX=1000+10;
int n,m,size,top,index;
int head[MAX],val[MAX],dfn[MAX],low[MAX];
int mark[MAX],stack[MAX]; struct Edge{
int v,next;
Edge(){}
Edge(int V,int NEXT):v(V),next(NEXT){}
}edge[MAX*2]; void Init(int num){
for(int i=0;i<=num;++i)head[i]=-1,mark[i]=0;
size=top=index=0;
} void InsertEdge(int u,int v){
edge[size]=Edge(v,head[u]);
head[u]=size++;
} void tarjan(int u){
if(mark[u])return;
dfn[u]=low[u]=++index;
stack[++top]=u;
mark[u]=1;
for(int i=head[u];i != -1;i=edge[i].next){
int v=edge[i].v;
tarjan(v);
if(mark[v] == 1)low[u]=min(low[u],low[v]);
}
if(dfn[u] == low[u]){
while(stack[top] != u){
mark[stack[top]]=-1;
val[u]=min(val[u],val[stack[top]]);
low[stack[top--]]=low[u];
}
mark[u]=-1;
--top;
}
} int main(){
int u,v;
while(~scanf("%d%d",&n,&m)){
Init(n);
for(int i=1;i<=n;++i)scanf("%d",val+i);
for(int i=0;i<m;++i){
scanf("%d%d",&u,&v);
InsertEdge(u,v);
}
for(int i=1;i<=n;++i){
if(mark[i])continue;
tarjan(i);
}
for(int i=0;i<=n;++i)mark[i]=0;
for(int i=1;i<=n;++i){
for(int j=head[i];j != -1;j=edge[j].next){
v=edge[j].v;
if(low[i] == low[v])continue;
mark[low[v]]=1;
}
}
int sum=0,ans=0;
for(int i=1;i<=n;++i){
if(!mark[low[i]] && dfn[i] == low[i])++ans,sum+=val[i];
mark[low[i]]=1;
}
printf("%d %d\n",ans,sum);
}
return 0;
}
hdu1827之强联通的更多相关文章
- hdu2767之强联通缩点
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2767-Proving Equivalences(强联通+缩点)
题目地址:pid=2767">HDU 2767 题意:给一张有向图.求最少加几条边使这个图强连通. 思路:先求这张图的强连通分量.假设为1.则输出0(证明该图不须要加边已经是强连通的了 ...
- 搭建自己私有的PKM系统,各家PKM大比拼。。附:构建自己熟悉的基础Docker,破解联通光猫
Docker这容器真是很好玩!干啥都想上docker了,快疯了. 这不,最近wiz笔记开始收费,很是不爽,需要寻求新的PKM系统了.备选及落选理由如下: wiz笔记 -- 好用,顺手.要开始收费了,不 ...
- 华为荣耀6 H60-L02/L12(联通版)救砖包【适用于无限重启】
本帖最后由 HOT米粒 于 2014-11-16 20:43 编辑 华为荣耀6 H60-L02/L12(联通版)救砖包[适用于无限重启]说明: 1.本工具包用于华为荣耀6 H60-L02(联通版): ...
- nyoj-一笔画问题-欧拉图+联通判定
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- java 验证手机号码、电话号码(包括最新的电信、联通和移动号码)
一.目前的号码段(2016-12-8更新) 二.代码 package com.test; import java.util.regex.Pattern; public class CheckPho ...
- Codeforces 731C. Socks 联通块
C. Socks time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input o ...
- Kosaraju算法---强联通分量
1.基础知识 所需结构:原图.反向图(若在原图中存在vi到vj有向边,在反向图中就变为vj到vi的有向边).标记数组(标记是否遍历过).一个栈(或记录顶点离开时间的数组). 算法描叙: :对 ...
- 我所了解的各公司使用的 Ceph 存储集群 (携程、乐视、有云、宝德云、联通等)
Ceph 作为软件定义存储的代表之一,最近几年其发展势头很猛,也出现了不少公司在测试和生产系统中使用 Ceph 的案例,尽管与此同时许多人对它的抱怨也一直存在.本文试着整理作者了解到的一些使用案例. ...
随机推荐
- python中os和sys模块
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境. os 常用方法 os.rem ...
- Redis 使用多个数据库及密码配置
redis的默认端口是6379,可以使用的数据库最多有16个,不同数据库之间是独立的, 可以通过 select num 的方式访问不同的数据库 可以通过下面的命令来切换到不同的数据库下,每个数据库都有 ...
- Scrum基础知识图谱
啰嗦一下 最近在学习scrum项目管理的知识,书上知识点分散,很难有整体的视角来看scrum有哪些核心知识,故制作了思维导图,望给和我一样容易迷失的人一样,起到一个指引作用,废话不多说,直接上图 图谱
- SPFA ----模板 O(kE) (k一般不超过2)
原理:若一个点入队的次数超过顶点数V,则存在负环: #include "bits/stdc++.h" using namespace std; ; struct Edge { in ...
- ssh 远程执行绝对路径命令mysqld_multi 报my_print_defaults不存在
通过SSH直接执行远程命令(这种方式会使用Bash的non-interactive + non-login shell模式)找不到命令参考:http://ghoulich.xninja.org/201 ...
- java面试题之Thread类中的start()和run()方法有什么区别
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法, 区别: 当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动: start()方法才会启动新 ...
- 在vue单页面应用当中使用sass
之前在项目当中有使用过sass,但是使用的方式有点Low,是在vue文件当中的style下面通过@import的方式引入的. 其实在webpack当中也可以通过在main.js当中import &qu ...
- d3 添加元素相关api
选择元素 d3.select([dom]) d3.selectAll([dom]) 添加元素 d3.select("body").append("p") 插入内 ...
- 事务的传播行为和隔离级别[transaction behavior and isolated level]
Spring中事务的定义:一.Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用: PROPAGATION_REQUIRED ...
- 部分转 php kafka
Step 1: 下载Kafka (官网地址:http://kafka.apache.org) Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1. ...