zoukankan      html  css  js  c++  java
  • Kruscal 、 Prime Template

    Kruscal  Template :

    很裸的Kruscal Template(求最小生成树中最长路,即最短路中最长路)

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
    #include <stdio.h>
    #include <iostream>
    #include <climits>
    #include <cstring>
    #include <algorithm>
    #define ll long long
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    const int MAX = 10500;
    
    int root[MAX],n,m,cnt;
    struct Edge{
        int s,e;
        int value;
    }edge[MAX];
    
    bool cmp(Edge a, Edge b){
        return a.value < b.value;
    }
    
    void init(){
        for(int i = 1; i <= n; ++i)
            root[i] = i;
    }
    
    int find(int x){
        return root[x] == x ? x : (root[x] = find(root[x]));
    }
    
    void merge(int a,int b){
        if(a < b)
            root[b] = a;
        else
            root[a] = b;
    }
    
    void kruskal(){
        int i,j;
        cnt = 0;
        for(i = 1; i <= m; ++i){
            int a = find(edge[i].s);
            int b = find(edge[i].e);
            if(a != b){
                merge(a,b);
                ++cnt;
            }
            if(cnt >= n-1){
                printf("%d
    ",edge[i].value);
                break;
            }
        }
    }
    int main(){
       int i,j;
       while(scanf("%d%d",&n,&m) != EOF){
           for(i = 1; i <= m; ++i)
               scanf("%d%d%d",&edge[i].s,&edge[i].e,&edge[i].value);
           sort(edge + 1, edge + 1 + m, cmp);
           init();
           kruskal();
       }
       return 0;
    }

    Prime Template :

    备注: map 初始化为 INF 无穷大

    double prim(){
        bool vis[MAXN];
        memset(vis, 0, sizeof(vis));
        double dis[MAXN];
        double ans = 0;
        int i,j;
        vis[1] = true;
        for(i = 1; i <= n; ++i)
            dis[i] = map[1][i];
        for(i = 1; i < n; ++i){
            int temp = INF, flag;
            for(j = 1; j <= n; ++j){
                if(!vis[j] && dis[j] <= temp){
                    temp = dis[j];
                    flag = j;
                }
            }
            vis[flag] = true;
            ans += dis[flag];
            for(j = 1; j <= n; ++j){
                if(!vis[j] && map[flag][j] < dis[j])
                    dis[j] = map[flag][j];
            }
        }
        return ans;
    }

  • 相关阅读:
    jQuery
    前端开发之JavaScript篇
    前端开发之css篇
    前端开发之html篇
    mysql续
    MySQL入门
    进程线程协程那些事儿
    Python之socket网络编程
    2016.6.24——vector<vector<int>>【Binary Tree Level Order Traversal】
    2016.6.21——Climbing Stairs
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/3896675.html
Copyright © 2011-2022 走看看