HDU1863

来源:互联网 发布:java实战项目 编辑:程序博客网 时间:2024/06/07 19:54

这道题意思很简单  要你求出能够到达所有点的一树,很自然就能想到用最小生成树去做,prim和kruscal都可以使用

#include<stdio.h>#include<string.h>#define arr 105#define inf 1<<30int m,g[arr][arr],dis[arr];int Prim(int st){    int i,j,k,Time,ans,mark[arr];    for(i=1;i<=m;i++) dis[i]=g[st][i],mark[i]=0;    dis[st]=inf, mark[st]=1;    ans=0;    for(Time=1;Time<m;Time++){        int min=inf,index=-1;        for(i=1;i<=m;i++)            if(!mark[i]&&dis[i]<min) min=dis[i],index=i;        if(index==-1) return -1; //无法生成一个树;        mark[index]=1;        ans+= min;        for(i=1;i<=m;i++)            if(!mark[i]&&g[index][i]<dis[i])                dis[i]=g[index][i];    }    return ans;}            int main(){    int n,i,j,x,y,t,s;    while(scanf("%d%d",&n,&m),n)    {        for(i=1;i<=m;i++)for(j=1;j<=m;j++)g[i][j]=inf;        while(n--){            scanf("%d%d%d",&x,&y,&t);            s=x; //任意选一个点作根求最小生成树;             if(t<g[x][y]) g[x][y]=g[y][x]=t;        }        int ans=Prim(s); //Prim()算法求最小生成树;        if(ans==-1) puts("?");        else printf("%d\n",ans);    }}           


0 0
原创粉丝点击