图结构练习——最小生成树
Time Limit: 1000MS
Memory Limit: 65536KB
Problem 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; }