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

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 <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;
}
时间: 2024-08-12 02:55:40

hdu1827之强联通的相关文章

hdu2767之强联通缩点

Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2768    Accepted Submission(s): 1038 Problem Description Consider the following exercise, found in a generic linear algebra

hdu3836之强联通缩点

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

?数据结构-图之强连通

数据结构-图之强连通 在一个无向图G中,若从顶点v_i到顶点v_j有路径相连(当然从v_j到v_i也一定有路径),则称v_i和v_j是连通的.如果G是有向图,那么连接v_i和v_j的路径中所有的边都必须同向.如果图中任意两点都是连通的,那么图被称作连通图.图的连通性是图的基本性质. 连通分量:无向图G的一个极大连通子图称为G的一个连通分量(或连通分支).连通图只有一个连通分量,即其自身:非连通的无向图有多个连通分量. 初级通路:通路中所有的顶点互不相同.初级通路必为简单通路,但反之不真. 强连通

图之强连通、强连通图、强连通分量 Tarjan算法

强连通分量 简介 在阅读下列内容之前,请务必了解图论基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图. 这里想要介绍的是如何来求强连通分量. Tarjan 算法 Robert E. Tarjan (1948~) 美国人. Tarjan 发明了很多算法结构.光 Tarjan 算法就有很多,比如求各种联通分量的 Tarjan 算法,求 LCA(Lowest Comm

正则验证手机号(联通,电信,移动手机号),不包含座机号,作为会员登陆(正则验证) winform

public static class RegxCheck { /// <summary> /// 正则表达式验证是否为手机号 /// </summary> /// <param name="telNum">需要验证的手机号</param> /// <returns></returns> public static bool CheckTelNum(string telNum) { //电信手机号码正则 strin

POJ 2186 Popular cows(Kosaraju+强联通分量模板)

题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为牛C是红人,那么牛A也认为牛C是红人.求被其他所有牛认为是红牛的牛的总数. 解题思路:把所有牛看成顶点,把有序对(A,B)看成从A到B的有向边,那么题目就变成了求所有顶点都可到达的顶点的总数.我们可以得到一个结论,如果一个强连通分量里有一头牛被认为是红人,那么该强联通分量里的所有牛都是红人,这显然是

图论——LCA、强联通分量、桥、割顶、二分图最大匹配、网络流

A: 交通运输线 时间限制: 5 Sec  内存限制: 128 MB 题目描述 战后有很多城市被严重破坏,我们需要重建城市.然而,有些建设材料只能在某些地方产生.因此,我们必须通过城市交通,来运送这些材料的城市.由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市之间没有道路.当然在运输线中,更不可能存在圈. 现在,你的任务来了.给你战后的道路情况,我们想知道,两个城市之间是否存在道路,如果存在,输出这两个城市之间的最短路径长度. 输入 第一行一个整数Case(Case<=10)表示测试数据

【吃炸弹的鸽子UVA10765-双联通模板】

·从前有一个鸽子Lence,它吃了一个炸弹,然后有人出了这道题. ·英文题,述大意:        给出一张连通无向图,求出:对于每个点,删去这个点(以及它相连的边以后)时,当前图中的连通块数量,这个值作为该点的Lence值.输出根据Lence值从大到小(相同时标号从小到大)的前m个点和它的Lence值. ·分析:       关于连通块问题,可以寻得三种方法:       ①嘎嘣脆算法(Gabow)②塔尔杨算法(Tarjan)③Kosaraju算法.        此处大米饼采用Tarjan算

资源和政策堆出来的联通还是衰落了,教训深刻

仅凭资源和政策是难以扶起一个有竞争力大企业的,内因才是主要的,有时候资源和政策还会成为绊脚石,让企业失去自省和奋发的动力. 最近三大运营商相继发布了2016年年度业绩报告,中国移动营收为人民币7084亿元,净利润1087亿元,同比增长0.2%:中国电信营收3523亿元,净利润180亿元,同比下降10.2%.去除出售铁塔一次性收入后净利润同比增长11.7%:中国联通营收为2742亿元,净利润6.25亿元,同比下降94.1%. 从财务上看,中国联通一年的净利润还顶不上中国移动三天的净利润,也顶不上中