hdu1863最小生成树krus模板

最小生成树的定义:权值和最小的连通路

krus:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;

//#define EdsonLin

#ifdef EdsonLin
#define debug(...) fprintf(stderr,__VA_ARGS__)
#else
#define debug(...)
#endif //EdsonLin

typedef long long ll;
typedef double db;
const int inf = 0x3f3f3f;
const int MAXN = 1e3;
const int MAXNN = 2e6+100;
//const int MAXM = 1e6;
//const int MAXM = 3e4+100;
const int MOD = 1000000007;
const db eps = 1e-3;
#define PB push_back

int readint(){int x;scanf("%d",&x);return x;}

struct kruskal{
    int n,m;
    struct edge{
        int u,v,dist;
    };
    int father[MAXN];
    vector<edge>E;
    void init(int n){this->n = n;for(int i=0;i<n;i++)father[i]=i;E.clear();}
    static bool cmp(edge a,edge b){return a.dist<b.dist;}

    int Find(int x){
        return x==father[x]?x:Find(father[x]);
    }
    void Union(int u,int v){
        father[u] = Find(u);
        father[v] = Find(v);
        father[father[u]] = father[v];
    }

    void addge(int u,int v,int dist){
        edge a;
        a.u = u;
        a.v = v;
        a.dist = dist;
        E.PB(a);
    }

    void mst(int &tol){
        sort(E.begin(),E.end(),cmp);
        for(std::vector<edge>::iterator li=E.begin();li!=E.end();li++){
            int u = (*li).u,v = (*li).v;
            if(Find(u)!=Find(v)){
                Union(u,v);
                tol += (*li).dist;
            }
        }
    }
    bool check(){
        int fa = Find(0);
        bool sg = true;;
        for(int i=1;i<n;i++){
            if(fa!=Find(i)){
                sg = false;
                break;
            }
        }
        return sg;
    }

}solver;

int main()
{
    #ifdef EdsonLin
        //freopen("1.in","r",stdin);
        //freopen("1.out","w",stdout);
        int _time_ed = clock();
    #endif //EdsonLin

    int n,m,tol;

    while(scanf("%d%d",&m,&n)!=EOF&&m){
        solver.init(n);
        int u,v,dis;
        tol = 0;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&dis);
            u--,v--;
            solver.addge(u,v,dis);
        }
        solver.mst(tol);
        if(!solver.check()){
            cout<<"?"<<endl;
            continue;
        }
        cout<<tol<<endl;
    }

    #ifdef EdsonLin
        debug("time: %d\n",int(clock()-_time_ed));
    #endif //EdsonLin
   // cout << "Hello world!" << endl;
    return 0;
}

krus

时间: 2024-10-29 20:49:53

hdu1863最小生成树krus模板的相关文章

最小生成树算法模板

#include<stdio.h>#include<string.h>#define Max 10000000int map[110][110],cost[110],vit[110],m,n;void prim(int x){    int i,j,min,k,sum=0;    memset(vit,0,sizeof(vit));    for(i=1;i<=m;i++)        cost[i]=map[x][i];    cost[x]=0;    vit[x]=1

【POJ 3241】曼哈顿最小生成树(模板整理)

关于 曼哈顿最小生成树 的证明见:http://www.2cto.com/kf/201505/399861.html 模板: #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN = 100010; const int INF = 0x3f3f3f3f; struct Point{ int x,y,i

最小生成树(模板)

prim模板: 1 int prim(){ 2 for(int i = 1; i <= n; i ++){ 3 mincost[i] = cost[1][i]; 4 vis[i] = false; 5 } 6 mincost[1] = 0; 7 int res = 0; 8 while(true){ 9 int v = -1; 10 for(int i = 1; i <= n; i ++){ 11 if(!vis[i] && (v == -1 || mincost[i] <

hdu 1879 继续畅通工程 最小生成树入门模板题

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15227    Accepted Submission(s): 6598 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

最小生成树基础模板题(USACO Training Section 3.1 最短网络 Agri-Net)

农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000 输入格式: 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的

最小生成树计数 模板 hdu 4408

题意是给定n个点,m条边的无向图,求最小生成树的个数对p取模. 用kruscal计算最小生成树时,每次取连接了两个不同联通块的最小的边.也就是先处理d1条c1长度的边,再处理d2条c2长度的边.长度相同的边无论怎么选,最大联通情况都是固定的. 分别对ci长度的边产生的几个联通块计算生成树数量再乘起来,然后把这些联通块缩点,再计算ci+1长度的边. 生成树计数用Matrix-Tree定理,上一篇是无重边的,这题的缩点后是会产生重边的,Matrix-tree也适用:   //抄别人博客的 Kirch

最小生成树【模板】

Kruskal算法 struct Edge { int from; int to; int w; }; Edge Edges[200200]; int father[200200],N,M; int find(int x) { if(x != father[x]) father[x] = find(father[x]); return father[x]; } int cmp(Edge a,Edge b) { return a.w < b.w; } int Kruskal() { int a,b

【裸最小生成树】 模板 poj 1258

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define MAX 102 void read(); using namespace std; int map[MAX][MAX],best[MAX],n; bool visit[MAX]; int main() { //freopen("in.txt","r",stdin

最小生成树(模板 prim)

Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表, 表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出村庄数目N ( 1< N < 100 ):随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号