uva 6437 - Power Plant【最小生成树】

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4448

题目大意:和基本的最小生成树想比,其在最开始的时候有多个起点,从任一起点开始生成都可以。

一直到最后才发现做法,就是把起始点都提前加入生成树里面。

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn 205
int T,N,M,K;
int f[maxn];

struct node
{
  int u,v,w;
  bool operator<(const node &a)const
  {
      return w<a.w;
  }
}a[maxn];

int find(int x)
{
    return x==f[x]?x:f[x]=find(f[x]);
}

int kruscal()
{
    sort(a,a+M);
    int sum=0;
    for(int j=0;j<M;j++)
    {
        int x=find(a[j].u);
        int y=find(a[j].v);
        if(x!=y) sum+=a[j].w,f[y]=x;
    }
    return sum;
}

int main ()
{
    int fa,tem;
    scanf("%d",&T);
    for(int ii=1;ii<=T;ii++)
    {
        scanf("%d%d%d",&N,&M,&K);
        for(int i=0;i<=N;i++) f[i]=i;

        scanf("%d",&fa);
        for(int j=1;j<K;j++)
        {
            scanf("%d",&tem);
            f[tem]=fa;
        }

        for(int j=0;j<M;j++)
            scanf("%d%d%d",&a[j].u,&a[j].v,&a[j].w);
        printf("Case #%d: %d\n",ii,kruscal());
    }
}

uva 6437 - Power Plant【最小生成树】

时间: 2024-08-15 06:22:53

uva 6437 - Power Plant【最小生成树】的相关文章

LA 6437 Power Plant (prim最小生成树)

还是裸的最小生成树 #include<bits/stdc++.h> using namespace std; int T,N,M,P,K,a,b,c; int dist[1020],m[1020][1020]; bool p[1020]; void prim() { for(int i=1;i<=N;i++) { if(!p[i]) { int Min=1000020; for(int j=1;j<=N;j++) { if(p[j]&&m[i][j]!=0&

缩点:Power Plant;

题目传送门:[UVALive 6437]Power Plant 题目大意:T组数据,给定一幅带权图(n, m), 然后给定k个点, 与图中存在有若干条边.每个点都要至少要和这k个点的一个点直接或间接相连, 问最少的距离是多少. 1 ≤ T ≤ 100: 因为除了这k个点,其他的点是一个连通块,所以当前这个k点与其相连,我们并不需要知道原图中的点和i-k中哪个点相连,所以我们可以做一个超级汇点,让所有加的边与K相连: 即做了一个缩点的操作):做一遍最小生成树,那么这k个点必定会被选到: #incl

UVA 10330 Power Transmission(网络最大流)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1271  Power Transmission  The Problem DESA is taking a new project to transfer power. Power is generated by the newly established plant in Barisal.

UVa 10298 - Power Strings

题目:求一个串的最大的循环次数. 分析:dp,KMP,字符串.这里利用KMP算法. KMP的next函数是跳跃到最近的串的递归结构位置(串元素取值0 ~ len-1): 由KMP过程可知: 如果存在循环节,则S[0 ~ next[len]-1] 与 S[len-next[len] ~ len-1]相匹配: 则S[next[len] ~ len-1]就是循环节(且最小),否则next[len]为0: 因此,最大循环次数为len/(len-next[len]),最小循环节为S[next[len] ~

UVA 11149 - Power of Matrix(矩阵倍增)

UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞,∑kiAi=(1+Ak/2)∑k/2iAi,不断二分即可 代码: #include <cstdio> #include <cstring> const int N = 45; int n, k; struct mat { int v[N][N]; mat() {memset(v, 0, sizeof(v));} mat operator * (mat

UVA - 10298 Power Strings (KMP求字符串循环节)

Description Problem D: Power Strings Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiati

[2016-03-03][UVA][1374][Power Calculus]

[2016-03-03][UVA][1374][Power Calculus] 时间:2016-03-03 16:14:01 星期四 题目编号:UVA 1374 题目大意:给出x的指数n,问,x经过多少次相乘才能得到x^n 输入:n 输出:次数 分析: 求乘法的所有可能方式,用dfs,适当剪枝优化,变成IDA* x的乘法,变成了指数的加法 每次不断平方,最少次数 为 不断平方的次数.这个为maxd起点 方法: 枚举每一位出现过的次数,当前字数加上枚举出来的次数,进入下一层dfs 剪枝:如果预计最

UVA 10298 - Power Strings(KMP)

UVA 10298 - Power Strings 题目链接 题意:本意其实就是,给定一个字符串,求出最小循环节需要几次循环出原字符串 思路:利用KMP中next数组的性质,n - next[n]就是最小循环节,然后n / 循环节就是答案 代码: #include <cstdio> #include <cstring> const int N = 1000005; char str[N]; int next[N]; void getnext() { int n = strlen(s

cf 434d Nanami&#39;s Power Plant 网络流

题目大意就是有n个发电机,每个发电机有l到r个档位可供选择,每个档位的输出功率是已知的,另外还有一些限制条件,形式为xu ≤ xv + d,表示发电机u的档位要小于v的档位加d,d是一个已知的整数.求n个发电机的最大功率. 假设没有最后那个限制条件,那么对于每个发电机i拆点成l-1,l...到r相邻两档位连边为max-f(i),f(i)是档位i的输出功率,max是一个大数,大于等于所有档位的输出功率.l-1与源点连inf的边,r与汇点连inf的边.假设最大流为flow,那么max*n-flow就