首页 > 代码库 > poj 2485

poj 2485

题意://岛要修路,这个岛上有n个城市,要求修完路后,各城市之间可以相互到达,且修的总路程最短  求所有道路的最长的一段路程

思路:Kruskal 算法简单的应用

#include<iostream>
#include<cstring>
using namespace std;
int map[501][501];
int dist[501];
int s[501];
int n;
void Krudkal()
{
    int i,j;
    int max=0;
    memset(s,0,sizeof(s));
    for(i=1;i<=n;i++)
        dist[i]=map[1][i];
    s[1]=1;
    for(i=1;i<n;i++)
    {
        int v=-1;
        int min=999999999;
        for(j=1;j<=n;j++)
            if(dist[j]<min&&!s[j])
            {
                min=dist[j];
                v=j;
            }
        if(v==-1) break;
        if(min>max) max=min;
        s[v]=1;
        //sum+=dist[v];
        dist[v]=0;
        for(j=1;j<=n;j++)
        {
            if(dist[j]>map[v][j])
                dist[j]=map[v][j];
        }
    }
    cout<<max<<endl;
}
int min(int x,int y)
{
    if(x<y) return x;
    return y;
}
int main()
{
    int t,i,j;
    //cin>>t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                scanf("%d",&map[i][j]);
            }
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                int e=min(map[i][j],map[j][i]);
                map[i][j]=e;
                map[j][i]=e; 
            }
        Krudkal();
    }
    return 0;
}