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计算出至少要通知多少人,至少得花多少电话费就能让所有人都被通知到吗?
 

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 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说明至少要给这个联通块中的某一个人打电话,费用取这个联通块中花费最小的那一个。
代码:

#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
原创粉丝点击