标签:cin a20 std code sizeof 距离 splay sed 记录
1.Prim
//手写prim 类似于dijkstra #include<iostream> #include<cstring> using namespace std; const int INF=0x7fffffff; const int maxn=100; int graph[maxn][maxn]; int visit[maxn]; int dist[maxn]; int m,n; int prime(int cur) { int index; int sum = 0; memset(visit, 0, sizeof(visit)); //标记未访问的点 visit[cur] = true;//当前的点入树 for(int i = 0; i < m; i ++){ dist[i] = graph[cur][i]; //dis记录起始点到各个点之间的距离 } for(int i = 1; i < m; i ++){ //从第二个点开始检测 目的是为了找最小权值 int mincost = INF; for(int j = 0; j < m; j ++){//遍历所有点 找最短距离及点 if(!visit[j] && dist[j] < mincost){ mincost = dist[j]; index = j; } } visit[index] = true;//入树操作 sum += mincost; for(int j = 0; j < m; j ++){//更新结点 if(!visit[j] && dist[j] > graph[index][j]){ dist[j] = graph[index][j]; } } } return sum; } int main() { int u,v,l; cin>>m>>n; memset(graph,0x3f,sizeof(graph)); for(int i=0;i<n;i++){ cin>>u>>v>>l; graph[u-1][v-1]=graph[v-1][u-1]=l; } cout<<prime(0); }
测试数据;
5 6 1 2 5 2 3 5 2 4 12 3 4 17 2 5 15 3 5 6
2.Kraskal算法
#include <iostream> #include<algorithm> using namespace std; #define MAX 100 struct edge { int x,y; int w; }e[MAX]; int fa[MAX]; int rank[MAX]; int sum; int cmp(edge a,edge b)//排序函数 { if(a.w!=b.w) return a.w<b.w; else { return a.x<b.x; } } void make_set(int x)//初始化节点 { fa[x]=x; rank[x]=0; } int find(int x)//查找父节点 { return fa[x]==x?x:fa[x]=find(fa[x]); } void union_set(int x,int y,int w)//合并节点 { if(rank[x]>rank[y]) { rank[y]=x; } else if(rank[x]<rank[y]) { rank[x]=y; } else { rank[x]++; rank[y]=x; } sum+=w;//总权值加上w } int main() { int x,y,w; int m,n;//n是点,m是边 cin>>n>>m; for(int i=0;i<m;i++) { cin>>x>>y>>w; e[i].x=x; e[i].y=y; e[i].w=w; make_set(x); make_set(y); } sort(e,e+m,cmp); sum=0; for(int i=0;i<n;i++) { x=find(e[i].x); y=find(e[i].y); w=e[i].w; if(x!=y) { union_set(x,y,w); } } cout<<sum<<endl; return 0; }
标签:cin a20 std code sizeof 距离 splay sed 记录
原文地址:https://www.cnblogs.com/helloworld2019/p/10361924.html