2144-图结构练习——最小生成树
2017-08-21 15:10
302 查看
图结构练习——最小生成树
Problem Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。Input
输入包含多组数据,格式如下。第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
Output
每组输出占一行,仅输出最小花费。Example Input
3 21 2 1
1 3 1
1 0
Example Output
20
//prim算法 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<climits> #define INF 2147483647 using namespace std; int vis[10000]; int dis[1000][1000]; int g[10000]; int prime(int dis[][1000],int n) { int max,min,sum=0; int i,j; int p; memset(vis,0,sizeof(vis)); vis[1]=1; for(i=0;i<=n;i++) g[i]=dis[1][i]; for(i=1;i<n;i++) { max=INF; p=-1; for(j=1;j<=n;j++) { if(vis[j]==0 && max>g[j]) { max=g[j]; p=j; } } sum=sum+max; vis[p]=1; for(j=1;j<=n;j++) { if(vis[j]==0 && g[j]>dis[p][j]) { g[j]=dis[p][j]; } } } return sum; } int main() { int n,m,u,v,w; int i,j; while(scanf("%d %d",&n,&m)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) { dis[i][j]=0; } else { dis[i][j]=INF; } } } for(i=0;i<m;i++) { cin>>u>>v>>w; if(dis[u][v]>w) { dis[u][v]=w; dis[v][u]=w; } } cout<<prime(dis,n)<<endl; } return 0; }
相关文章推荐
- sdut oj2144 图结构练习——最小生成树(普利姆算法)
- SDUT 2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树 Kruskal
- SDUT 2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树
- [SDUT](2144)图结构练习——最小生成树 ---最小生成树(图)
- SDUT OJ 2144 图结构练习——最小生成树
- 【2144】图结构练习——最小生成树 (prim算法模板) (sdut)
- 【2144】图结构练习——最小生成树 (prim算法模板) (sdut)
- SUDT 2144 图结构练习——最小生成树
- sdut 2144 图结构练习——最小生成树(最小生成树)
- SDUT 2144 图结构练习-最小生成树
- SDUT 2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树(kruskal模版)
- SDUT 2144 图结构练习——最小生成树
- SDUT-2144 图结构练习——最小生成树
- sdut2144图结构练习——最小生成树
- sdut 2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树
- OJ2144图结构练习——最小生成树