图结构练习——最小生成树
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
输入
输出
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
2 0
提示
来源
示例程序
普里姆算法
- #include<stdio.h>
- #include<string.h>
- const int inf=0x3f3f3f3f;
- int map[110][110];
- int dis[110];
- int vis[100];
- int sum;
- int prim(int n)
- {
- int i, j;
- int pos;
- memset(vis, 0, sizeof(vis));
- for(i=1; i<=n; i++)
- {
- dis[i]=map[1][i];
- }
- vis[1]=1;
- for(i=1;i<=n;i++)
- {
- int min=inf;
- for(j=1;j<=n;j++)
- {
- if(!vis[j] && dis[j]<min)
- {
- min=dis[j];
- pos=j;
- }
- }
- if(min>=inf) break;
- sum+=min;
- vis[pos]=1;
- for(j=2;j<=n;j++)
- {
- if(!vis[j] && map[pos][j]<dis[j])
- {
- dis[j]=map[pos][j];
- }
- }
- }
- }
- int main()
- {
- int n, m;
- int i, j;
- int a, b, c;
- while(~scanf("%d%d", &n, &m))
- {
- sum=0;
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=n;j++)
- {
- map[i][j]=inf;
- }
- map[i][i]=0;
- }
- for(i=1;i<=m;i++)
- {
- scanf("%d%d%d", &a, &b, &c);
- if(map[a][b]>c)
- map[a][b]=map[b][a]=c;
- }
- prim(n);
- printf("%d\n", sum);
- }
- return 0;
- }
436



被折叠的 条评论
为什么被折叠?



