图结构练习——最小生成树
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入
输出
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
2 0
题目大意:用最小的代价把n个城市连接起来.。 (每天一个算法,加油!)
代码:
/*************************************************************************
> File Name: prim.cpp
> Author:
> Mail:
> Created Time: 2016年03月28日 星期一 20时18分58秒
************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define inf 999999
int map[110][110];
int vis[110];
int lowcost[110];
int sum,i,j;
int n,pos,min;
void prim()
{
memset(vis,0,sizeof(vis));
sum=0;
vis[1]=1; //因为是连接所有城市,所以从哪个城市开始是都一样的
for(i=1;i<=n;i++)
{
lowcost[i]=map[1][i];
}
for(i=1;i<n;i++)
{
min=inf;
for(j=1;j<=n;j++)
{
if(vis[j]==0&&min>lowcost[j])
{
min=lowcost[j];
pos=j;
}
}
sum+=min;
vis[pos]=1;
for(j=1;j<=n;j++)
{
if(vis[j]==0&&lowcost[j]>map[pos][j])
lowcost[j]=map[pos][j];
}
}
printf("%d\n",sum);
}
int main()
{
int m;
int a,b,c;
while(~scanf("%d %d",&n,&m))
{
if(m<n-1)
{
printf("0\n");
}
else
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j) map[i][j]=0;
else
{
map[i][j]=inf;
}
}
}
while(m--)
{
scanf("%d %d %d",&a,&b,&c);
if(c<map[a][b])
map[a][b]=map[b][a]=c;
}
prim();
}
}
return 0;
}