Constructing Roads POJ - 2421 prim算法

/**
题意:有n个村子,他们现在需要修路,给出每两个村庄的距离,求连通村庄所需
修路的最短长度,但是有些路已经是修好了,所以不需要重修,简单的说就是边值为0;
这个也没什么,很简单;
*/


#include
#include
#include
using namespace std;

const int inf=0x3f3f3f3f;
const int maxn=1e2+7;
int dis[maxn],mmp[maxn][maxn],ans;
bool vis[maxn];
int n,m;

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;
        double Min=inf;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[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 ()
{
    scanf("%d",&n);
    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<=n;i++)
        for(int j=1;j<=n;j++)
        scanf("%d",&mmp[i][j]);

        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            mmp[a][b]=mmp[b][a]=0;
        }
        prim();
    return 0;
}







你可能感兴趣的:(ACM--最小生成树)