思路:prime,考虑重边!!!
#include<stdio.h>
#include<string.h>
int map[1001][1001],dist[1001];
int vis[1001],n;
void init1()
{
int i,j;
for(i = 0;i < n;i ++)
{
for(j = 0;j < n;j ++)
{
if(i != j)
map[i][j] = 1 << 30;
}
}
}
void init2()
{
int i;
memset(vis,0,sizeof(vis));
for(i = 0;i < n;i ++)
dist[i] = map[0][i];
}
int main()
{
int m,i,j,k,cnt;
int min,len,sum,a,b;
while(~scanf("%d%d",&n,&m))
{
init1();
sum = cnt = 0;
while(m--)
{
scanf("%d%d%d",&a,&b,&len);
if(len < map[a][b])
map[a][b] = map[b][a] = len;
}
init2();
vis[0] = 1;
for(i = 0;i < n;i ++)
{
min = 1 << 30;
for(j = 0;j < n;j ++)
{
if(!vis[j] && min > dist[j])
{
min = dist[j];
k = j;
}
}
vis[k] = 1;
if(min != 1 << 30)
{
cnt++;
sum += min;
}
for(j = 0;j < n;j ++)
{
if(!vis[j] && dist[j] > map[k][j])
dist[j] = map[k][j];
}
}
if(cnt == n-1)
printf("%d\n\n",sum);
else
printf("impossible\n\n");
}
return 0;
}