• POJ 1751 Highways (kruskal)


    题目链接:http://poj.org/problem?id=1751

    题意是给你n个点的坐标,然后给你m对点是已经相连的,问你还需要连接哪几对点,使这个图为最小生成树。

    这里用kruskal不会超时,用prim应该会超时,特别注意在输入的时候不要多组输入,否则会TLE。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <vector>
     6 using namespace std;
     7 const int MAXN = 755;
     8 struct edge {
     9     int u , v , cost;
    10 }a[MAXN * MAXN];
    11 int x[MAXN] , y[MAXN] , cont , par[MAXN] , cnt , f , ans[MAXN * 2];
    12 bool vis[MAXN][MAXN];
    13 
    14 void init(int n) {
    15     for(int i = 1 ; i <= n ; i++) {
    16         par[i] = i;
    17     }
    18     memset(vis , false , sizeof(vis));
    19     cont = 0;
    20     cnt = n;
    21 }
    22 
    23 int Find(int n) {
    24     if(n == par[n])
    25         return n;
    26     return (par[n] = Find(par[n]));
    27 }
    28 
    29 bool cmp(edge a , edge b) {
    30     return a.cost < b.cost;
    31 }
    32 
    33 int kruskal() {
    34     for(int i = 1 ; i <= cont ; i++) {
    35         if(cnt == 1)
    36             break;
    37         int u = Find(a[i].u) , v = Find(a[i].v);
    38         if(u != v) {
    39             ans[f++] = a[i].u;
    40             ans[f++] = a[i].v;
    41             par[u] = v;
    42             cnt--;
    43         }
    44     }
    45 }
    46 
    47 int main()
    48 {
    49     int n , m , u , v;
    50     scanf("%d" , &n);
    51     {
    52         init(n);
    53         for(int i = 1 ; i <= n ; i++) {
    54             scanf("%d %d" , x + i , y + i);
    55         }
    56         scanf("%d" , &m);
    57         while(m--) {
    58             scanf("%d %d" , &u , &v);
    59             u = Find(u) , v = Find(v);
    60             vis[u][v] = vis[v][u] = true;
    61             if(u != v) {
    62                 par[u] = v;
    63                 cnt--;
    64             }
    65         }
    66         for(int i = 1 ; i <= n ; i++) {
    67             for(int j = 1 ; j < i ; j++) {
    68                 if(vis[i][j])
    69                     continue;
    70                 cont++;
    71                 a[cont].u = j , a[cont].v = i;
    72                 a[cont].cost = (x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j]);
    73             }            
    74         }
    75         sort(a + 1 , a + cont + 1 , cmp);
    76         f = 0;
    77         kruskal();
    78         for(int i = 0 ; i < f ; i += 2) {
    79             printf("%d %d
    " , ans[i] , ans[i + 1]);
    80         }
    81     }
    82 }
  • 相关阅读:
    Python爬虫一
    Python爬虫二
    DRF框架中的演变View
    计算时间复杂度例题
    vue2.x webpack打包资源路径问题
    vs code运行c语言 控制台乱码 问题
    解决视频的声音和画面不同步问题
    c语言数据结构,静态链表,结构体数组
    swagger @ApiModel添加实体类不生效
    计算及校验海明码的3个举例
  • 原文地址:https://www.cnblogs.com/Recoder/p/5306961.html
Copyright © 2020-2023  润新知