51nod 1212 无向图最小生成树(prim)

来源:互联网 发布:淘宝开店保证金30元 编辑:程序博客网 时间:2024/06/06 03:30

1212 无向图最小生成树
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。
Input
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
Output
输出最小生成树的所有边的权值之和。
Input示例
9 141 2 42 3 83 4 74 5 95 6 106 7 27 8 18 9 72 8 113 9 27 9 63 6 44 6 141 8 8
Output示例
37

//prim算法,与最短路径 Dijkstra相似 #include<stdio.h>#include<algorithm>#include<string.h>using namespace std;#define MAX 1005#define inf 0x3f3f3f3fint mat[MAX][MAX];int dist[MAX],visit[MAX];int prim(int n){int i,j;int sum=0;memset(visit,0,sizeof(visit));visit[1]=1;for( i=2;i<=n;i++){dist[i]=mat[1][i];}dist[1]=0;for( i=2;i<=n;i++){int minn=inf,k;for(j=1;j<=n;j++){if(!visit[j]&&dist[j]<minn){minn=dist[j];k=j;}} visit[k]=1;sum+=minn;if(inf==minn)return -1;for(int j=1;j<=n;j++){if(!visit[j]&&dist[j]>=mat[k][j])dist[j]=mat[k][j];}}return sum;}int main(){int a,b,c;int n,m;scanf("%d%d",&n,&m);memset(mat,inf,sizeof(mat));for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);if(mat[a][b]>c){mat[a][b]=c;mat[b][a]=c;}}printf("%d\n",prim(n));return 0;}



原创粉丝点击