Summer Holiday (hdu 1827 强联通缩点)
来源:互联网 发布:智能黑科技软件 编辑:程序博客网 时间:2024/05/19 09:17
Summer Holiday
Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2054 Accepted Submission(s): 941
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计算出至少要通知多少人,至少得花多少电话费就能让所有人都被通知到吗?
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。
第一行两个整数N和M(1<=N<=1000, 1<=M<=2000),表示人数和联系对数。
接下一行有N个整数,表示Wiskey联系第i个人的电话费用。
接着有M行,每行有两个整数X,Y,表示X能联系到Y,但是不表示Y也能联系X。
Output
输出最小联系人数和最小花费。
每个CASE输出答案一行。
每个CASE输出答案一行。
Sample Input
12 162 2 2 2 2 2 2 2 2 2 2 2 1 33 22 13 42 43 55 44 66 47 47 127 88 78 910 911 10
Sample Output
3 6
Author
威士忌
题意不多说,先Tarjan缩点,然后求出每个联通块的入度,入度为0说明至少要给这个联通块中的某一个人打电话,费用取这个联通块中花费最小的那一个。
代码:
题意不多说,先Tarjan缩点,然后求出每个联通块的入度,入度为0说明至少要给这个联通块中的某一个人打电话,费用取这个联通块中花费最小的那一个。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <stack>#include <vector>#include <set>#include <queue>#pragma comment (linker,"/STACK:102400000,102400000")#define mod 1000000009#define INF 0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-6#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,r#define FRE(i,a,b) for(i = a; i <= b; i++)#define FREE(i,a,b) for(i = a; i >= b; i--)#define FRL(i,a,b) for(i = a; i < b; i++)#define FRLL(i,a,b) for(i = a; i > b; i--)#define mem(t, v) memset ((t) , v, sizeof(t))#define sf(n) scanf("%d", &n)#define sff(a,b) scanf("%d %d", &a, &b)#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)#define pf printf#define DBG pf("Hi\n")typedef long long ll;using namespace std;const int MAXN = 20010;//点数const int MAXM = 500010;//边数struct Edge{ int to,next;}edge[MAXM];int head[MAXN],tot;int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值是1~sccint Index,top;int scc;//强联通分量的个数bool Instack[MAXN];int num[MAXN];//各个强联通分量包含的点的个数,数组编号为1~scc//num数组不一定需要,结合实际情况void addedge(int u,int v){ edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++;}void Tarjan(int u){ int v; Low[u]=DFN[u]=++Index; Stack[top++]=u; Instack[u]=true; for (int i=head[u];i+1;i=edge[i].next) { v=edge[i].to; if (!DFN[v]) { Tarjan(v); if (Low[u]>Low[v]) Low[u]=Low[v]; } else if (Instack[v]&&Low[u]>DFN[v]) Low[u]=DFN[v]; } if (Low[u]==DFN[u]) { scc++; do{ v=Stack[--top]; Instack[v]=false; Belong[v]=scc; num[scc]++; }while (v!=u); }}void solve(int N){ memset(DFN,0,sizeof(DFN)); memset(Instack,false,sizeof(Instack)); memset(num,0,sizeof(num)); Index=scc=top=0; for (int i=1;i<=N;i++) //点的编号从1开始 if (!DFN[i]) Tarjan(i);}int n,m;int cost[MAXN],d[MAXN];void init(){ tot=0; memset(head,-1,sizeof(head)); memset(d,0,sizeof(d));}int main(){#ifndef ONLINE_JUDGE freopen("C:/Users/asus1/Desktop/IN.txt","r",stdin);#endif int i,j,u,v; while (~sff(n,m)) { init(); for (i=1;i<=n;i++) sf(cost[i]); for (i=0;i<m;i++) { sff(u,v); addedge(u,v); } solve(n); for (u=1;u<=n;u++) { for (i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if (Belong[u]!=Belong[v]) d[Belong[v]]++; } } int NUM=0,ans=0; for (i=1;i<=scc;i++) { if (d[i]==0) { int Min=INF; for (j=1;j<=n;j++) { if (Belong[j]==i&&Min>cost[j]) Min=cost[j]; } ans+=Min; NUM++; } } pf("%d %d\n",NUM,ans); } return 0;}
Source
HDOJ 2007 Summer Exercise(3)- Hold by Wiskey
Recommend
威士忌 | We have carefully selected several similar problems for you: 1823 1824 1826 1269 1822
0 0
- Summer Holiday (hdu 1827 强联通缩点)
- hdoj 1827 Summer Holiday 强联通缩点
- HDU 1827 Summer Holiday (强连通分量+缩点)
- HDU 1827 - Summer Holiday (强连通 + 缩点)
- HDU 1827 Summer Holiday 强连通分量缩点
- hdu 1827 Summer Holiday 强连通分量缩点
- hdu 1827 Summer Holiday(强连通分量+缩点)
- HDOJ 1827 - Summer Holiday 简单的tarjan求强联通分量+缩点
- 【HDU】1827 Summer Holiday 强连通缩点
- HDU 1827--Summer Holiday【强连通缩点新建图】
- HDU 1827 Summer Holiday 强连通缩点
- hdu 1827 Summer Holiday tarjan+缩点
- hdu 1827 Summer Holiday【Tarjan缩点】
- HDU ACM 1827 Summer Holiday->强连通分量+缩点(tarjan算法)
- hdu 1827 Summer Holiday【强连通Kosaraju+缩点染色+思维】
- 【强连通分量+缩点】 HDOJ 1827 Summer Holiday
- HDU 1827 Summer Holiday(强连通分量)
- HDU 1827 Summer Holiday(强连通)
- HDU 1281 棋盘游戏
- Swift之数组使用
- jvm相关
- string 类
- unix网络编程各种TCP客户-服务器程序设计实例(二)
- Summer Holiday (hdu 1827 强联通缩点)
- unix网络编程之基本套接口编程
- linux网络基础-远程管理
- 剑指offer || 03_replaceBlank
- javascript用正则表达式检测用户名的合法性
- unix网络编程各种TCP客户-服务器程序设计实例附环境搭建和编译方法(一)
- android 获取应用列表 点击打开应用
- 指针的问题2 指向常量的指针与常量指针
- POJ 3087 Shuffle'm Up(简单模拟)