[JZOJ4629] 修路

来源:互联网 发布:mysql 查找所有子部门 编辑:程序博客网 时间:2024/04/29 16:05

Description

这里写图片描述

Solution

观察题目,我们可以发现

  • 选一条边并不影响其他边对答案的贡献。

所以连接x,y的边i对答案的贡献显然是cost[i]a[x]a[y]

然后这样跑一遍最小生成树

Code

#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)using namespace std;struct node{    int x,y,z;}rd[100005];int m,n,a[100005],ft[100005];bool cmp(node x,node y){    return x.z<y.z;} int getf(int k){    if (ft[k]==0) return k;    ft[k]=getf(ft[k]);    return ft[k];}int main(){    cin>>n>>m;    int i,j;    fo(i,1,n)scanf("%d",&a[i]);    fo(i,1,m)    {        scanf("%d%d%d",&rd[i].x,&rd[i].y,&rd[i].z);        rd[i].z-=a[rd[i].x]+a[rd[i].y];    }     sort(rd+1,rd+m+1,cmp);    i=0,j=0;    int ans=0;    while(j<n-1)    {        i++;        int fx=getf(rd[i].x),fy=getf(rd[i].y);        if (fx!=fy)         {            ft[fx]=fy;            ans+=rd[i].z;            j++;        }    }    cout<<ans;}
0 0
原创粉丝点击