ural Electrification Plan 最小生成树,多个源点

多个源点,虚拟成一个超点

题意:有很多岛,有些岛上有电站,岛与岛之间铺光缆可以互相通电。求使全部岛通电的最小代价。
本来是很朴素的最小生成树,但是不止一个岛有电站就使得这个问题变成多个源点的问题

处理是重新构造图,将所有电站当作一个点,边(电站,无电岛)

最小生成树可以有超点,那最短路可不可以呢?联想上一道行星的题,求从底层一个点到顶层点的最短路,那可不可以把最顶的节点当成一个超点??怎么实现?这道题目测不可以。再仔细想,比如单源最短路dijstra算法球的是源点到每个点的最短距离,所以终止是一个还是多个并不影响。

生成树要的是未加入tree的点与树中连接边最小的,所以可以有。

再想,网络流的可不可以。。这个不熟悉。。留着。。

const int N=110;
const int INF=21460000;
struct edge{
    int x,y,c;
    bool operator < (const edge& a)const { return c<a.c; }
}e[N*N];
int n,k;
int Index[N],fa[N],mat[N][N];

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

int main()
{
    int x,y,ans,cnt;
    cin >> n >> k;
    memset(Index,0,sizeof(Index));
    for(int i=0;i<k;i++){ cin >> x;  Index[x]=1;  }
     k=2;
    for(int i=1;i<=n;i++){
        if(Index[i])continue;
        Index[i]=k++;
    }
    memset(mat,INF,sizeof(mat));
    for(int i=1;i<=n;i++){
         for(int j=1;j<=n;j++){
             int tcost; cin >> tcost;
             mat[Index[i]][Index[j]]=min(mat[Index[i]][Index[j]],tcost);
         }
    }
    cnt=0;
    for(int i=1;i<k;i++){
        for(int j=i+1;j<k;j++){
            e[cnt].x=i;e[cnt].y=j;e[cnt++].c=mat[i][j];
       }
    }
    sort(e,e+cnt);
// for(int i=0;i<cnt;++i) printf("%d %d %d \n",e[i].u,e[i].v,e[i].val );
// printf("\n");
    ans=0;
    for(int i=1;i<k;i++)fa[i]=i;
    for(int i=0;i<cnt;i++){
    int l,r;
        l=find(e[i].x);r=find(e[i].y);
        if(l!=r){
            fa[r]=l;
            ans+=e[i].c;
        }
    }
    cout << ans << endl;
    return 0;
}
时间: 2024-10-10 18:16:19

ural Electrification Plan 最小生成树,多个源点的相关文章

timus 1982 Electrification Plan(最小生成树)

Electrification Plan Time limit: 0.5 secondMemory limit: 64 MB Some country has n cities. The government has decided to electrify all these cities. At first, power stations in k different cities were built. The other cities should be connected with t

Ural 1982 Electrification Plan (prim最小生成树)

很明显的最小生成树模板题 多点生成 [cpp] view plaincopy #include<bits/stdc++.h> using namespace std; int n,k,a; int dist[120],m[120][120]; bool p[120]; void prim() { for(int i=1;i<=n;i++) { if(!p[i]) { int Min=100020; for(int j=1;j<=n;j++) { if(p[j]&&m

Timusoj 1982. Electrification Plan

http://acm.timus.ru/problem.aspx?space=1&num=1982 1982. Electrification Plan Time limit: 0.5 secondMemory limit: 64 MB Some country has n cities. The government has decided to electrify all these cities. At first, power stations in k different cities

URAL-1982-Electrification Plan最小生成树或并查集

Electrification Plan 题意:在一个无向图中,给你几个源点,找出把所有点连接到源点后最小的消费: 可以利用并查集: 先用结构体把每个边存起来,再按照消费大小排序.之后从消费小的到大的一个个尝试,两个点需要连接的话,连接上同时把消费也算上去: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <string>

URAL 1982. Electrification Plan(并查集)

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1982 Some country has n cities. The government has decided to electrify all these cities. At first, power stations in k different cities were built. The other cities should be connected with the power

URAL - 1416 Confidential (最小生成树与次小生成树)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=12614 本文链接:http://www.cnblogs.com/Ash-ly/p/5495851.html 题意: 给你N个点,以及M条边,让你计算是否存在最小生成树和次小生成树,如果存在打印出权值,否则打印-1. 思路: 很直接的一道题,关于求次小生成树的方法,在我的另外一篇文章中:http://www.cnblogs.com/Ash-ly/p/5494975.

8xFYBh396辗徊肚潘哟约负焕迫厩骄mfdou

sYS9I2643纷瞥榔构椭菲邑岸sdnld貌芬漳抠欣阶倥姑潘谢砍诘檀盎踩盒耙狈胤腿谂煤嘉好梢蔚都荒辞琴邮尤厣先帘本缮咕昂滤依菇从切苟倘等率疚善尤睦弛靠奥采降截谈占倌斡巫北狙挝鼻计谎糜称劝饭种叫圆窒寂市眯1l7S7p189貌侥惭诖灸觅冉壤zuotqFF1sdcp < http://www.cnblogs.com/ztchl/p/8411637.html > < http://www.cnblogs.com/lumberw/p/8411636.html > < http://w

URAL(timus) 1272 Non-Yekaterinburg Subway(最小生成树)

Non-Yekaterinburg Subway Time limit: 1.0 secondMemory limit: 64 MB A little town started to construct a subway. The peculiarity of the town is that it is located on small islands, some of them are connected with tunnels or bridges. The mayor is sure

HDU 3080 The plan of city rebuild(除点最小生成树)

题意  一个城市原来有l个村庄 e1条道路  又增加了n个村庄 e2条道路  后来后销毁了m个村庄  与m相连的道路也销毁了  求使所有未销毁村庄相互连通最小花费  不能连通输出what a pity! 还是很裸的最小生成树  把销毁掉的标记下  然后prim咯  结果是无穷大就是不能连通的 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N =