您的位置:首页 > 其它

修路【NOIP2016提高组模拟】

2016-07-16 11:25 441 查看

题目



样例输入:



3 3

1 2 3

1 2 21

1 3 21

2 3 22

样例输出:



34

数据范围:



解法:很裸的MST了,每条边上的值减去相连的两个点的值作为该边的值,然后直接MST了。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define ll long long

using namespace std;

const int maxn=1e5+5;
int n,m,dad[maxn],a[maxn];
ll ans;
struct cy{
int x,y;
ll z;
}fre[maxn];

int cmp(cy a,cy b)
{
return a.z<b.z;
}
int get(int x)
{
if (x==dad[x]) return x;
else {
int k=get(dad[x]);
dad[x]=k; //这里比赛时忘打了QWQ,直接爆炸,以此警戒!
return k;
}
}
void kruskal()
{
int k=n-1;
int i=1;
while (k>0){
int x=get(fre[i].x),y=get(fre[i].y);
if (x!=y){
dad[x]=y;
ans+=fre[i].z;
--k;
}
++i;
}
}
int main()
{
//freopen("T2.in","r",stdin);
scanf("%d%d",&n,&m);
fo(i,1,n) {
scanf("%d",&a[i]);
dad[i]=i;
}
fo(i,1,m){
scanf("%d%d%d",&fre[i].x,&fre[i].y,&fre[i].z);
fre[i].z=fre[i].z-(ll)a[fre[i].x]-(ll)a[fre[i].y];
}
sort(fre+1,fre+m+1,cmp);
kruskal();
printf("%lld",ans);
//fclose(stdin);
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最小生成树