POJ 2485

最小生成树的例子。

这次求的不是 最小生成树边的权值之和,而是构成最小生成树中 最长的边。不过,无论题目怎么变化,Prim算法的核心思想是 一样的,只要改变一下 最后输出的结果,找边的最大值即可。

最后,说一下,这道题目的输出格式。本来没什么要求,可就是题目中说 每个样例 之后空一行,结果我cout<<endl之后,反而结果通不过。结果我把空格去掉竟然通过了。

#include <iostream>
using namespace std;

#define MAXV 510
#define MAX 65540

int n;
int map[MAXV][MAXV];
bool vis[MAXV];
int dis[MAXV];

void Prim(){
    int i,j,k;
    k = 0;
    for(i=0;i<n;i++){
        dis[i] = map[0][i];
        vis[i] = 0;
    }
    for(i=1;i<=n;i++){
        int temp = MAX;
        for(j=0;j<n;j++){
            if(!vis[j]&&dis[j]<temp){
                temp = dis[j];
                k = j;
            }
        }
        vis[k] = 1;
        for(j=0;j<n;j++){
            if(!vis[j]&&dis[j]>map[k][j]){
                dis[j] = map[k][j];
            }
        }
    }
    int result = -1;
    for(i=0;i<n;i++)
        if(dis[i]>result)
            result = dis[i];
    cout<<result<<endl;
}

int main(){
    int i,j;
    int Case;
    cin>>Case;
    while(cin>>n,Case--){
        for(i=0;i<n;i++){
            for(j=0;j<n;j++)
                cin>>map[i][j];
        }
        Prim();
    }
    return 0;
}

下面是 Kruskal算法实现:

#include <iostream>
#include <algorithm>
using namespace std;

#define MAXV 500
#define MAX 65540

int P[MAXV];

struct Pro{
    int u;
    int v;
    int w;
}E[MAXV*MAXV];

bool cmp(Pro a,Pro b){
    return a.w<b.w;
}

int Find(int a){
    return a == P[a]?a:a=Find(P[a]);
}

int main(){
    int Case;
    cin>>Case;
    int n,i,j,value;
    while(cin>>n,Case--){
        for(i=0;i<=n;i++)
            P[i] = i;
        int k=0;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++){
                cin>>value;
                if(i>j){
                    E[k].u = i;
                    E[k].v = j;
                    E[k].w = value;
                    k++;
                }
            }
        int result = -1;
        sort(E,E+k,cmp);
        for(i=0;i<k;i++){
            int x = Find(E[i].u);
            int y = Find(E[i].v);
            if(x!=y){
                P[x] = y;
                if(E[i].w > result)
                    result = E[i].w;
            }
        }
        cout<<result<<endl;
    }
    return 0;
}

这道题 两种算法比较一下, 会发现 构建的图 属于 密集型,所以Prim算法效率更高一些

你可能感兴趣的:(C++,算法,poj,kruskal,Prim)