蓝桥杯最小生成树

来源:互联网 发布:泰宇数据保全系统 编辑:程序博客网 时间:2024/05/28 15:33

这道题第一遍的时候不知道结点如何处理,后来画了图自己走一遍就发现可以吧边权设为l=2*l+x+y;

#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;struct Node{    int x,y,l;}Edge[100000+5];bool cmp(const Node a,const Node b){    return a.l<b.l;}int pre[10000+5];int find(int x){    if(pre[x]==x)        return x;    int t=find(pre[x]);    pre[x]=t;    return t;}int C[10000+5];int main(){    int n,p,minn=9999999;    scanf("%d %d",&n,&p);    for(int i=1;i<=n;i++)    {        scanf("%d",&C[i]);        minn=min(minn,C[i]);        pre[i]=i;    }    for(int i=1;i<=p;i++)    {        scanf("%d %d %d",&Edge[i].x,&Edge[i].y,&Edge[i].l);       // pre[Edge[i].y]=Edge[i].x;        Edge[i].l=2*Edge[i].l+C[Edge[i].x]+C[Edge[i].y];    }    /*    for(int i=1;i<=n;i++)        printf("%d %d\n",pre[i],i);        */    sort(Edge+1,Edge+1+p,cmp);    int sum=0;    for(int i=1;i<=p;i++)    {        int fx=find(Edge[i].x);        int fy=find(Edge[i].y);       // printf("%d %d %d %d\n",fx,fy,Edge[i].x,Edge[i].y);        if(fy!=fx)        {            sum+=Edge[i].l;            pre[fy]=fx;           // printf("%d %d %d\n",sum,Edge[i].x,Edge[i].y);        }    }    printf("%d\n",sum+minn);    return 0;}


0 0