POJ

来源:互联网 发布:windows 程序设计 编辑:程序博客网 时间:2024/06/10 21:28
/**水题 水题 prim 水过;以后再来写一波克鲁斯卡尔;并查集不是很溜;*/#include<cstdio>#include<cstring>using namespace std;const int inf=0x3f3f3f3f;const int maxn=1e2+7;int n,m,ans,mmp[maxn][maxn],dis[maxn];bool vis[maxn];void prim(){    ans=0;    for(int i=1;i<=n;i++)    {        dis[i]=mmp[1][i];        vis[i]=0;    }    vis[1]=1;    for(int i=1;i<=n;i++)    {        int k=-1,Min=inf;        for(int j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<Min)            {                Min=dis[j];                k=j;            }        }        if(k==-1) break;        vis[k]=1;        ans+=Min;        for(int j=1;j<=n;j++)            if(!vis[j]&&dis[j]>mmp[k][j])            dis[j]=mmp[k][j];    }    printf("%d\n",ans);}int main (){    while(~scanf("%d",&n))    {        if(n==0) break;        scanf("%d",&m);        if(m==0) {printf("0\n");continue;}        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)            if(i==j) mmp[i][j]=0;        else mmp[i][j]=inf;        for(int i=1;i<=m;i++)        {            int u,v,w;            scanf("%d %d %d",&u,&v,&w);            if(w<mmp[u][v]) mmp[u][v]=mmp[v][u]=w;        }        prim();    }    return 0;}
原创粉丝点击