Timusoj 1982. Electrification Plan

http://acm.timus.ru/problem.aspx?space=1&num=1982

1982. Electrification Plan

Time limit: 0.5 second
Memory 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 the power stations via power lines. For any cities ij it is possible to build a power line between them incij roubles. The country is in crisis after a civil war, so the government decided to build only a few power lines. Of course from every city there must be a path along the lines to some city with a power station. Find the minimum possible cost to build all necessary power lines.

Input

The first line contains integers n and k (1 ≤ k ≤ n ≤ 100). The second line contains k different integers that are the numbers of the cities with power stations. The next n lines contain an n × ntable of integers {cij} (0 ≤ cij ≤ 105). It is guaranteed that cij = cjicij > 0 for i ≠ jcii = 0.

Output

Output the minimum cost to electrify all the cities.

Sample

input output
4 2
1 4
0 2 4 3
2 0 5 2
4 5 0 1
3 2 1 0
3

Problem Author: Mikhail Rubinchik 
Problem Source: Open Ural FU Championship 2013

Tags: graph theory  (hide tags for unsolved problems)

Difficulty: 144    Printable version    Submit solution    Discussion (4)
All submissions (2430)    All accepted submissions (894)    Solutions rating (630)

分析:

无向图,给n个点,n^2条边,每条边有个一权值,其中有k个点有发电站,给出这k个点的编号,选择最小权值的边,求使得剩下的点都能接收到电。

  发电站之间显然不能有边,那么把k个点合成一个点,然后在图上就MST就可以了。

AC代码1:

    1、edge[i][j]=0是个很巧妙的设置。

2、求最小生成树,由于生成树是图的极小联通子图。最小生成树一定要包含图中所有的点。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define INF 0x3f3f3f3f
 5 using namespace std;
 6
 7 int edge[110][110];
 8 int vis[110],dis[110];
 9 bool flag[110];
10 int n,k,ans;
11
12 void prim()
13 {
14     int u=1,minw;
15     for(int i=1;i<=n;i++)
16     {
17         vis[i]=0;
18         dis[i]=edge[u][i];
19     }
20     vis[u]=1;
21     for(int i=1;i<n;i++)
22     {
23         minw=INF;
24         for(int j=1;j<=n;j++)
25         {
26             if(!vis[j] && dis[j]<minw)
27             {
28                 minw=dis[j];
29                 u=j;
30             }
31         }
32         ans+=minw;
33         vis[u]=1;
34         for(int j=1;j<=n;j++)
35         {
36             if(!vis[j] && edge[u][j]<dis[j])
37                 dis[j]=edge[u][j];
38         }
39     }
40 }
41
42 int main()
43 {
44     int d;
45     while(scanf("%d%d",&n,&k)!=EOF)
46     {
47         memset(vis,0,sizeof(vis));
48         memset(flag,false,sizeof(flag));
49         ans=0;
50         for(int i=0;i<k;i++)
51         {
52             scanf("%d",&d);
53             flag[d]=true;
54         }
55         for(int i=1;i<=n;i++)
56         {
57             for(int j=1;j<=n;j++)
58             {
59                 scanf("%d",&edge[i][j]);
60             }
61         }
62         for(int i=1;i<=n;i++)
63         {
64             for(int j=1;j<=n;j++)
65             {
66                 if(flag[i]&&flag[j])
67                     edge[i][j]=0;
68             }
69         }
70         prim();
71         printf("%d\n",ans);
72     }
73     return 0;
74 }

AC代码2:

  1 //STATUS:C++_AC_31MS_401KB
  2 #include <functional>
  3 #include <algorithm>
  4 #include <iostream>
  5 //#include <ext/rope>
  6 #include <fstream>
  7 #include <sstream>
  8 #include <iomanip>
  9 #include <numeric>
 10 #include <cstring>
 11 #include <cassert>
 12 #include <cstdio>
 13 #include <string>
 14 #include <vector>
 15 #include <bitset>
 16 #include <queue>
 17 #include <stack>
 18 #include <cmath>
 19 #include <ctime>
 20 #include <list>
 21 #include <set>
 22 #include <map>
 23 using namespace std;
 24 //#pragma comment(linker,"/STACK:102400000,102400000")
 25 //using namespace __gnu_cxx;
 26 //define
 27 #define pii pair<int,int>
 28 #define mem(a,b) memset(a,b,sizeof(a))
 29 #define lson l,mid,rt<<1
 30 #define rson mid+1,r,rt<<1|1
 31 #define PI acos(-1.0)
 32 //typedef
 33 typedef __int64 LL;
 34 typedef unsigned __int64 ULL;
 35 //const
 36 const int N=110;
 37 const int INF=0x3f3f3f3f;
 38 const int MOD=95041567,STA=8000010;
 39 const LL LNF=1LL<<60;
 40 const double EPS=1e-8;
 41 const double OO=1e15;
 42 const int dx[4]={-1,0,1,0};
 43 const int dy[4]={0,1,0,-1};
 44 const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 45 //Daily Use ...
 46 inline int sign(double x){return (x>EPS)-(x<-EPS);}
 47 template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
 48 template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
 49 template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
 50 template<class T> inline T Min(T a,T b){return a<b?a:b;}
 51 template<class T> inline T Max(T a,T b){return a>b?a:b;}
 52 template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
 53 template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
 54 template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
 55 template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
 56 //End
 57
 58 struct Edge{
 59     int u,v,val;
 60     bool operator < (const Edge& a)const {
 61         return val<a.val;
 62     }
 63 }e[N*N];
 64 int n,k;
 65 int id[N],p[N],w[N][N];
 66
 67 int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
 68
 69 int main()
 70 {
 71  //   freopen("in.txt","r",stdin);
 72     int i,j,a,x,y,ans,cnt;
 73     while(~scanf("%d%d",&n,&k))
 74     {
 75         mem(id,0);
 76         for(i=0;i<k;i++){
 77             scanf("%d",&a);
 78             id[a]=1;
 79         }
 80         k=2;
 81         for(i=1;i<=n;i++){
 82             if(id[i])continue;
 83             id[i]=k++;
 84         }
 85         mem(w,INF);
 86         for(i=1;i<=n;i++){
 87             for(j=1;j<=n;j++){
 88                 scanf("%d",&a);
 89                 w[id[i]][id[j]]=Min(w[id[i]][id[j]],a);
 90             }
 91         }
 92         cnt=0;
 93         for(i=1;i<k;i++){
 94             for(j=i+1;j<k;j++){
 95                 e[cnt].u=i,e[cnt].v=j;
 96                 e[cnt].val=w[i][j];
 97                 cnt++;
 98             }
 99         }
100         sort(e,e+cnt);
101         ans=0;
102         for(i=1;i<k;i++)p[i]=i;
103         for(i=0;i<cnt;i++){
104             x=find(e[i].u);y=find(e[i].v);
105             if(x!=y){
106                 p[y]=x;
107                 ans+=e[i].val;
108             }
109         }
110
111         printf("%d\n",ans);
112     }
113     return 0;
114 }

时间: 2024-08-29 15:56:21

Timusoj 1982. Electrification Plan的相关文章

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

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(并查集)

题目链接: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 Electrification Plan 最小生成树,多个源点

多个源点,虚拟成一个超点 题意:有很多岛,有些岛上有电站,岛与岛之间铺光缆可以互相通电.求使全部岛通电的最小代价.本来是很朴素的最小生成树,但是不止一个岛有电站就使得这个问题变成多个源点的问题 处理是重新构造图,将所有电站当作一个点,边(电站,无电岛) 最小生成树可以有超点,那最短路可不可以呢?联想上一道行星的题,求从底层一个点到顶层点的最短路,那可不可以把最顶的节点当成一个超点??怎么实现?这道题目测不可以.再仔细想,比如单源最短路dijstra算法球的是源点到每个点的最短距离,所以终止是一个

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

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

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

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

2015南阳CCPC A - Secrete Master Plan 水题

D. Duff in Beach Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Master Mind KongMing gave Fei Zhang a secrete master plan stashed in a pocket. The plan instructs how to deploy soldiers on the four corners of the city wall. Unfortunately, w

hdu 5540 Secrete Master Plan(水)

Problem Description Master Mind KongMing gave Fei Zhang a secrete master plan stashed in a pocket. The plan instructs how to deploy soldiers on the four corners of the city wall. Unfortunately, when Fei opened the pocket he found there are only four

ORACLE cannot fetch plan for SQL_ID

今天做SQL执行计划测试的时候,发现sqlplus无法正常打印执行计划,根据网上资料整理如下: ..... [email protected]> select * 2     from table( 3           dbms_xplan.display_cursor( format=> 'allstats last' ) 4           ) 5   / PLAN_TABLE_OUTPUT ---------------------------------------------