poj3984(最短路)

简单的prim算法,虽然我现在刚学

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=500+10;
int mapp[maxn][maxn];
int n;
const int inf=0x3f3f3f3f;
void prim()
{
    int maxlen=-1;
    bool vis[maxn];
    int mincost[maxn];
    memset(vis,false,sizeof(vis));
    for(int i=1; i<=n; i++)
        mincost[i]=mapp[1][i];
    vis[1]=true;
    int v;
    for(int j=2; j<=n; j++)
    {    int mini=inf;//每次更新一遍最小值,作为寻找标准
        for(int i=1; i<=n; i++)
            if(!vis[i]&&mincost[i]<mini)//寻找最小的下一个节点
            {
                v=i;
                mini=mincost[i];
            }
        vis[v]=true;
        if(mini!=inf&&mini>maxlen) maxlen=mini;
        for(int i=1; i<=n; i++)
            if(!vis[i])
                mincost[i]=min(mincost[i],mapp[v][i]);//更新,寻找此节点到下一个节点的最小值
    }
    printf("%d\n",maxlen);
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                int m;
                scanf("%d",&m);
                mapp[i][j]=mapp[j][i]=m;//存储

            }
        prim();
    }
    return 0;
}

  

posted on 2017-03-25 10:54  发牌员  阅读(121)  评论(0)    收藏  举报

导航