修路【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); }
相关文章推荐
- Prim(普里姆)算法求最小生成树的思想及C语言实例讲解
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- 最小生成树算法之Prim算法
- 使用C语言实现最小生成树求解的简单方法
- 最小生成树算法——Prim和Kruskal算法的实现
- Data Structure - Week 15
- poj 2485 Highways
- HDU1301 最小生成树kruskal裸题
- Kruskal 最小生成树
- 最小生成树
- 图的最小生成树学习笔记
- 克如斯卡尔算法--最小生成树
- 普里姆算法--最小生成树
- poj2395 解题报告
- HDU-1233 还是畅通工程(最小生成树&并查集)
- 最小生成树之prim算法
- 最小生成树 : Kruskal 算法
- 最小生成树 : Prim 算法
- java数据结构 最小生成树
- POJ1251-Jungle Roads