SDUT 2144-最小生成树
2017-08-17 17:18
232 查看
图结构练习——最小生成树
Time Limit: 1000MSMemory Limit: 65536KBProblem Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。Input
输入包含多组数据,格式如下。第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
Output
每组输出占一行,仅输出最小花费。Example Input
3 2 1 2 1 1 3 1 1 0
Example Output
2 0
就是普里姆算法,没什么特别的,另外还有个坑
#include<iostream> #include<string.h> using namespace std; #define max 100000 int ma[101][101],lowc[101],vis[101],n,m; int prim() { int mi,flag,sum=0; for(int i=0;i<=n;i++) lowc[i]=ma[1][i];//这里从1开始遍历(从哪开始都可以) vis[1]=1; for(int i=1;i<n;i++) { mi=max; flag=0; for(int j=0;j<=n;j++) { if(!vis[j]&&lowc[j]<mi)//找出代价最小的 { mi=lowc[j]; flag=j; } } sum+=mi;//代价累加 vis[flag]=1; for(int j=0;j<=n;j++)//更新lowc { if(!vis[j]&&lowc[j]>ma[flag][j]) { lowc[j]=ma[flag][j]; } } } return sum; } int main() { int a,b,q; while(cin>>n>>m) { for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { if(i==j) ma[i][j]=0; else ma[i][j]=max; } } for(int i=0;i<m;i++) { cin>>a>>b>>q; if(q<ma[a][b])//坑在这里!!!!!我本来以为这步没必要,但是提交后WA!!!加上才AC了,真的气!!! { ma[a][b]=ma[b][a]=q; } } memset(vis,0,sizeof(vis)); cout<<prim()<<endl; } return 0; }
相关文章推荐
- SDUT 2144 图结构练习——最小生成树 Kruskal
- SDUT 2144 图结构练习-最小生成树
- SDUT-2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树
- sdut2144图结构练习——最小生成树
- sdut 2144 图结构练习——最小生成树
- sdut 2144 图结构练习——最小生成树(最小生成树)
- SDUT 2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树
- [SDUT](2144)图结构练习——最小生成树 ---最小生成树(图)
- SDUT 2144 图结构练习——最小生成树
- 【2144】图结构练习——最小生成树 (prim算法模板) (sdut)
- 【2144】图结构练习——最小生成树 (prim算法模板) (sdut)
- SDUT 2144 图结构练习——最小生成树(kruskal模版)
- SDUT 2144 图结构练习——最小生成树
- SDUT 2144 图结构练习——最小生成树
- sdut 2428 Ubiquitous Religions(最小生成树)
- SDUT 2896 最小生成树(Kruskal)
- sdut 2805(最小生成树)