标签:ESS oci 查找 break 并查集 tree intern ring hid
Description
Input
Output
Sample Input
5 8 1 2 3 1 3 7 2 3 10 2 4 4 2 5 8 3 4 6 3 5 2 4 5 17
Sample Output
42
Hint
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,m,sum; struct node { int start;///起点 int end;///终点 int power;///权值 } edge[20050]; int pre[20050]; int cmp(node a,node b) { return a.power<b.power;///按权值降序排列 // return a.power<b.power } int find(int x)///并查集找祖先 { int a;///循环法 a=x; while(pre[a]!=a) { a=pre[a]; } return a; } void merge(int x,int y,int n) { int fx =find(x); int fy =find(y); if(fx!=fy) { pre[fx]=fy; sum+=edge[n].power; } } int main() { int i,x,count; while(scanf("%d%d",&n,&m)!=EOF) { sum=0; count=0; for(i=1; i<=m; i++) { scanf("%d%d%d",&edge[i].start,&edge[i].end,&x); edge[i].power=x; //edge[i].power=-x; } for(i=1; i<=m; i++) ///并查集的初始化 { pre[i]=i; } sort(edge+1,edge+m+1,cmp); for(i=1; i<=m; i++) { merge(edge[i].start,edge[i].end,i); } for(i=1; i<=n; i++) { if(pre[i]==i) { count++; } } if(count==1) { printf("%d\n",sum); // printf("%d\n",-sum); } else { printf("-1\n"); } } return 0; }
///普里姆算法
#include<stdio.h> #include<string.h> #define MAX 0x3f3f3f3f using namespace std; int logo[1010];///用0和1来表示是否被选择过 int map1[1010][1010]; int dis[1010];///记录任意一点到这一点的最近的距离 int n,m; int prim() { int i,j,now; int sum=0; for(i=1; i<=n; i++) ///初始化 { dis[i]=MAX; logo[i]=0; } for(i=1; i<=n; i++) { dis[i]=map1[1][i]; } dis[1]=0; logo[1]=1; for(i=1; i<n; i++) ///循环查找 { now=-MAX; int max1=-MAX; for(j=1; j<=n; j++) { if(logo[j]==0&&dis[j]>max1) { now=j; max1=dis[j]; } } if(now==-MAX)///防止不成图 { break; } logo[now]=1; sum=sum+max1; for(j=1; j<=n; j++) ///填入新点后更新最小距离,到顶点集的距离 { if(logo[j]==0&&dis[j]<map1[now][j]) { dis[j]=map1[now][j]; } } } if(i<n) { printf("-1\n"); } else { printf("%d\n",sum); } } int main() { int i,j; int a,b,c; while(scanf("%d%d",&n,&m)!=EOF)///n是点数 { for(i=1; i<=n; i++) { for(j=i; j<=n; j++) { if(i==j) { map1[i][j]=map1[j][i]=0; } else { map1[i][j]=map1[j][i]=-MAX; } } } for(i=0; i<m; i++) { scanf("%d%d%d",&a,&b,&c); if(map1[a][b]<c)///防止出现重边 { map1[a][b]=map1[b][a]=c; } } prim(); } return 0; }
标签:ESS oci 查找 break 并查集 tree intern ring hid
原文地址:https://www.cnblogs.com/wkfvawl/p/9246072.html