POJ :Networking

来源:互联网 发布:xplay6知乎 编辑:程序博客网 时间:2024/05/23 10:39

题目地址:

http://poj.org/problem?id=1287

最小生成树的模板题,不过要注意的是两条路之间可能不只有一条唯一的路,这里,选一条最小的路就行了。

代码:

//模板题//但是在两条路径之中可以有多个边//取最小的#include <iostream>#include<cstring>using namespace std;#define MAX 51#define INF 9999999int map[MAX][MAX];int micost[MAX];bool vis[MAX];int N,M;void Prim(){    int ans,i,j,v,Min;    for(i=1;i<=N;i++)    {        vis[i]=0;        micost[i]=map[1][i];    }    ans=0;    micost[1]=0;    vis[1]=1;    if(N==1){        cout<<0<<endl;    return;    }    for(i=2;i<=N;i++)    {        Min=INF;        for(j=2;j<=N;j++){            if(!vis[j]&&Min>micost[j]){                Min=micost[j];                v=j;            }        }            if(Min==INF)break;            else{                ans=ans+Min;            vis[v]=1;            }            for(j=2;j<=N;j++)            {                if(!vis[j]&&micost[j]>map[v][j])                    micost[j]=map[v][j];            }        }        cout<<ans<<endl;    }int main(){    int i,j,a,b,c;    while(cin>>N,N)    {        cin>>M;    for(i=1;i<=N;i++)        for(j=1;j<=N;j++)        {            if(i==j)map[i][j]=0;            else                map[i][j]=INF;        }//初始化        for(i=1;i<=M;i++)        {            cin>>a>>b>>c;            if(map[a][b]>c)                map[a][b]=map[b][a]=c;//取最小的        }//输入      Prim();    }    return 0;}
原创粉丝点击