zoukankan      html  css  js  c++  java
  • hdu-3371 Connect the Cities---kruskal

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=3371

    题目大意:

    给n个城市,m条路,k组已知路,求最小费用联通所有城市;

    解题思路:

    kruskal求MST,这道题目有毒,很容易超时,改了一下并查集才过,而且同一个代码有时过又是超时

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int maxn = 500 + 10;
     5 const int INF = 0x3f3f3f3f;
     6 int p[maxn];
     7 int tot;
     8 void init()
     9 {
    10     for(int i = 0; i < maxn; i++)p[i] = i;
    11 }
    12 int f(int x)
    13 {
    14     return x == p[x] ? x : p[x] = f(p[x]);
    15 }
    16 void Union(int x, int y)
    17 {
    18     x = f(x);
    19     y = f(y);
    20     if(x != y)
    21     {
    22         p[x] = y;//这里改成p[y] = x;有时过,有时会超时
    23         tot--;//不联通的数目减一
    24     }
    25 }
    26 struct edge
    27 {
    28     int u, v, w;
    29     bool operator < (const edge& a)
    30     {
    31         return w < a.w;
    32     }
    33 }a[maxn * maxn];
    34 int main()
    35 {
    36     int T, n, m, k, t, x, y;
    37     scanf("%d", &T);
    38     while(T--)
    39     {
    40         init();
    41         scanf("%d%d%d", &n, &m, &k);
    42         tot = n - 1;//最开始,不连通块数目为n-1
    43         for(int i = 1; i <= m; i++)
    44         {
    45             scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
    46         }
    47         sort(a + 1, a + 1 + m);
    48         while(k--)
    49         {
    50             scanf("%d%d", &t, &x);
    51             t--;
    52             while(t--)
    53             {
    54                 scanf("%d", &y);
    55                 Union(x, y);
    56             }
    57         }
    58         int ans = 0;/*
    59         for(int i = 1; i <= n; i++)cout<<p[i]<<" ";
    60         cout<<endl;*/
    61         for(int i = 1; i <= m; i++)
    62         {
    63             int x = a[i].u;
    64             int y = a[i].v;
    65             x = f(x), y = f(y);
    66             if(x != y)
    67             {
    68                 p[x] = y;
    69                 tot--;//不连通数目减一
    70                 ans += a[i].w;
    71             }
    72         }
    73         if(tot == 0)//全部连通
    74             printf("%d
    ", ans);
    75         else
    76             printf("-1
    ");
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    Nginx 容器教程
    Docker 微服务教程(搭建真正的网站)
    Docker 微服务教程
    Docker 入门教程
    MacOS Docker 安装
    Mac下Homebrew的安装与使用
    ElasticSearch实战
    使用mac自带终端修改hosts
    菜鸡的Java笔记
    菜鸡的Java笔记 comparator 比较器
  • 原文地址:https://www.cnblogs.com/fzl194/p/8901553.html
Copyright © 2011-2022 走看看