读书人

HDU 1863 通畅工程(prim算法)

发布时间: 2013-09-07 14:12:44 作者: rapoo

HDU 1863 畅通工程(prim算法)

转载请注明出处:http://blog.csdn.net/a1dark

分析:这题也是最小生成树的模板题、刚才用了kruskal算法做过了、现在换成prim继续做、其实两种算法的本质一样的、有点贪心的感觉、不过kruskal时以边为基础、prim是以点为基础、所以kruskal适合稀疏图、而prim更适合稠密图、


#include<stdio.h>#define INF 0x3f3f3fint m,n;int map[105][105];int vis[105];int val[105];void init(){    for(int i=1;i<=m;i++)        for(int j=1;j<=m;j++){            if(i==j)                map[i][j]=0;            else                map[i][j]=INF;        }}void prim(){    memset(vis,0,sizeof(vis));    for(int i=1;i<=m;i++)        val[i]=map[1][i];    int sum=0;    vis[1]=1;    for(int i=1;i<m;i++){        int min=INF;        int mink=1;        for(int j=1;j<=m;j++){            if(!vis[j]&&val[j]<min){                min=val[j];                mink=j;            }        }        vis[mink]=1;        sum+=min;        for(int j=1;j<=m;j++){            if(!vis[j]&&map[mink][j]<val[j])                val[j]=map[mink][j];        }    }    if(sum>=INF)        printf("?\n");    else        printf("%d\n",sum);}int main(){    int s,e,v;    while(scanf("%d%d",&n,&m)!=EOF){        if(n==0)break;        init();        for(int i=1;i<=n;i++){            scanf("%d%d%d",&s,&e,&v);            if(v<map[s][e]){                map[s][e]=map[e][s]=v;            }        }        prim();    }    return 0;}


读书人网 >编程

热点推荐