题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1233
思路:
最短路径模板题,这里谈一下写最短路径的题目时应该必须注意到的事情,虽然起点是随机选定的,但是由于起点其独特性,必须分开讨论。千万不要,加入循环里面随便讨论。因为这样很不容易说清楚的。
贴上代码:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 105
#define INF 9999999
int map[MAX][MAX];
bool vis[MAX];
int dis[MAX];
int N;
int ans;
void Prim()
{
int i,j,v,Min;
for(i=1;i<=N;i++)
{
dis[i]=map[1][i];
vis[i]=0;
}
//确定1是起点
dis[1]=0;
vis[1]=1;
ans=0;
//一定要注意起点。
//起点并不包含在循环里面
//分开讨论
for(i=2;i<=N;i++)
{
Min=INF;
for(j=2;j<=N;j++)
{
if(!vis[j]&&dis[j]<Min){
Min=dis[j];
v=j;
}
}
vis[v]=1;
if(Min!=INF)//这一句一一定不能少
ans=ans+Min;
for(j=2;j<=N;j++)
{
if(!vis[j]&&dis[j]>map[v][j])
dis[j]=map[v][j];
}
}
printf("%d\n",ans);
return;
}
int main()
{
int i,j,a,b,c,S;
while(scanf("%d",&N)!=EOF,N)
{
for(i=1;i<=N;i++)
{
map[i][i]=0;
}
S=N*(N-1)/2;
for(i=1;i<=S;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
Prim();
}
return 0;
}