HDU 2122

来源:互联网 发布:淘宝怎么举报卖家假货 编辑:程序博客网 时间:2024/06/13 04:54

思路: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;}


0 0