POJ--2421--Constructing Roads【最小生成树】

链接:http://poj.org/problem?id=2421

题意:n个村庄,告诉你任两个村庄间距离,要建一些路使得任两个村庄都可以互相到达,需要使花费最小,其中有q条路已经建了,求最小花费。


把已经建的路的权值改为0,再prim就行了。kruskal做的话,把建好的路用并查集合并,再kruskal就行了


prim算法

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define PI acos(-1.0)
#define MAXN 110
#define eps 1e-7
#define INF 0x7FFFFFFF
#define seed 131
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

int edge[MAXN][MAXN],vis[MAXN],dist[MAXN];
int n,m,ans;
void prim(){
    int i,j;
    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++)   dist[i] = edge[1][i];
    vis[1] = 1;
    for(i=0;i


kruskal算法

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define PI acos(-1.0)
#define MAXN 110
#define eps 1e-7
#define INF 0x7FFFFFFF
#define seed 131
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

struct node{
    int u,v,dis;
}edge[1001000];
int father[MAXN];
int n,m,ans,cnt;
bool cmp(node x,node y){
    return x.dis=n-1)  break;
        }
    }
}
int main(){
    int t,q,i,j,a,b;
    int x;
    while(scanf("%d",&n)!=EOF){
        m = 0;
        cnt = 0;
        ans = 0;
        for(i=1;i<=n;i++){
            father[i] = i;
            for(j=1;j<=n;j++){
                scanf("%d",&x);
                edge[m].u = i;
                edge[m].v = j;
                edge[m].dis = x;
                m++;
            }
        }
        scanf("%d",&q);
        for(i=0;i


你可能感兴趣的:(最小生成树MST,POJ代码)