题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=372
思路:一般需要考虑的就是能否组成最小生成树和2点之间选取最短边
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int n,p;
int map1[60][60];
int visit[60];
int lowdist[60];
int prim()
{
memset(visit,0,sizeof(visit));
int sum = 0;
for(int i=1; i<=n; i++)
lowdist[i] = map1[1][i];
visit[1] = 1;
int k;
for(int i=1; i<n; i++)
{
int min1 = inf;
for(int j=2; j<=n; j++)
{
if(!visit[j] && lowdist[j] < min1)
{
min1 = lowdist[j];
k = j;
}
}
visit[k] = 1;
sum += lowdist[k];
for(int j=2; j<=n ;j++)
{
if(!visit[j] && map1[k][j] < lowdist[j])
lowdist[j] = map1[k][j];
}
}
return sum;
}
int main()
{
int st,ed,value;
while(scanf("%d%d",&n,&p) && n)
{
memset(map1,inf,sizeof(map1));
for(int i=0; i<p; i++)
{
scanf("%d%d%d",&st,&ed,&value);
if(value < map1[st][ed] || value < map1[st][ed])
map1[st][ed] = map1[ed][st] = value;
}
printf("%d\n",prim());
}
return 0;
}