NYOJ 布线问题

#include<iostream>
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;

struct edge
{
    int u,v,w;
}edges[155000];

bool cmp(const edge &a,const edge &b)
{
    return a.w<b.w; 
    // a.w < b.w;            //RE原因,忘记添加return 
}
/*
bool cmp(edge a,edge b)
{
    return a.w < b.w;
}*/
int pre[505],vtc[505];
void InitSet(int v)
{
    for(int i=1;i<=v+1;i++)
        pre[i] = i;
}
int find(int x)
{
    if(x == pre[x])    return x;
    return pre[x] = find(pre[x]);     //路径压缩 
    //return find(pre[x])                //无路径压缩 
}
bool UnionSet(int x,int y)
{
    int fx = find(x);
    int fy = find(y);
    if(fx != fy)
    {
        pre[fy] = fx;
        return false;
    }
    return true;    //在一个集合中 
}
int Kruscal(int e,int v)
{
    int ans = 0;
    int cnt = 1;
    
    for(int i=1;i<=e&&cnt<v;i++)
    {
        bool k; 
        k = UnionSet(edges[i].u,edges[i].v);     //不在同一集合才能加入,返回false
        if(k == false)
        {
            //cout<<edges[i].u<<"  "<<edges[i].v<<"  "<<edges[i].w<<endl;
            ans += edges[i].w; 
            cnt++; 
        }
    }
    return ans;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int v,e;
        cin>>v>>e;
        InitSet(v);
        for(int i=1;i<=e;i++)
        {
            scanf("%d %d %d",&edges[i].u,&edges[i].v,&edges[i].w);
        }
        sort(edges+1,edges+e+1,cmp); 
        int ans = Kruscal(e,v);
        
        for(int i=0;i<v;i++)
            scanf("%d",&vtc[i]);
        sort(vtc,vtc+v);
        cout<<ans + vtc[0] <<endl;
    }
    return 0;
} 

 

posted @ 2018-10-21 15:28  萌新上路  阅读(104)  评论(0编辑  收藏  举报