标签:des style blog http color io os ar java
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3072
3 3 0 1 100 1 2 50 0 2 100 3 3 0 1 100 1 2 50 2 1 100 2 2 0 1 50 0 1 100
150 100 50
有n个人,告诉前者给后者传送信息的花费,如果两个人能互相传送信息,则这两个人传送信息免费。leader的编号为0.求leader的信息传到所有人的最小花费。
解题思路:
tarjan+最小树形图
先tarjan求强连通分量,然后缩点建图(题目保证是一棵树),然后求最小树形图(做法:把指向所有点的花费最小的边求和即可)
代码:
//#include<CSpreadSheet.h>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define Maxn 55000
int low[Maxn],dfn[Maxn],sta[Maxn],sc,bc,n,m,dep;
int in[Maxn],ans;
bool iss[Maxn];
bool vis[110];
vector<vector<int> >myv;
int edge[110][110];
int ex[2*Maxn],ey[2*Maxn],ev[2*Maxn];
void tarjan(int cur)
{
    int ne;
    low[cur]=dfn[cur]=++dep;
    sta[++sc]=cur;
    iss[cur]=true;
    for(int i=0;i<myv[cur].size();i++)
    {
        int ne=myv[cur][i];
        if(!dfn[ne])
        {
            tarjan(ne);
            if(low[ne]<low[cur])
                low[cur]=low[ne];
        }
        else if(iss[ne]&&dfn[ne]<low[cur])
            low[cur]=dfn[ne];
    }
    if(low[cur]==dfn[cur])
    {
        ++bc;
        do
        {
            ne=sta[sc--];
            iss[ne]=false;
            in[ne]=bc;
        }while(ne!=cur);
    }
}
void solve()
{
    dep=sc=bc=0;
    memset(iss,false,sizeof(iss));
    memset(dfn,0,sizeof(dfn));
    for(int i=0;i<n;i++)
        if(!dfn[i])
            tarjan(i);
}
int main()
{
    //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   while(~scanf("%d%d",&n,&m))
   {
       myv.clear();
       myv.resize(n+1);
       for(int i=1;i<=m;i++)
       {
           scanf("%d%d%d",&ex[i],&ey[i],&ev[i]);
           myv[ex[i]].push_back(ey[i]);
       }
       solve();
       memset(edge,INF,sizeof(edge));
       for(int i=1;i<=m;i++)
       {
           int a=ex[i],b=ey[i];
           if(in[a]!=in[b])
               edge[in[a]][in[b]]=min(edge[in[a]][in[b]],ev[i]);
       }
       memset(vis,false,sizeof(vis));
       vis[in[0]]=true;
       int ans=0;
       for(int i=1;i<bc;i++)
       {
           int temp=INF,re;
           for(int j=1;j<=bc;j++)
                for(int k=1;k<=bc;k++)
                {
                    if(!vis[k]&&edge[j][k]<temp)
                    {
                        temp=edge[j][k];
                        re=k;
                    }
                }
           ans+=temp;
           vis[re]=true;
       }
       printf("%d\n",ans);
   }
    return 0;
}
[tarjan+最小树形图] hdu 3072 Intelligence System
标签:des style blog http color io os ar java
原文地址:http://blog.csdn.net/cc_again/article/details/39735541