码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 3714

时间:2014-11-04 16:46:30      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   os   for   sp   div   

题意:n<=2000的盒子,有一些里面有球,再给你所有c[i][j](1<=i<=j<=n),即告诉你【i,j】里面球的总数的奇偶性需要花费c[i][j],现在求知道所有的盒子的状态需要最少花费为多少。。

思路:PA系列的题目确实不错。

         思路比较有意思但是不难。

         如果知道i,j之间任意两点间的关系以及任意一个盒子的状态,那么很显然i,j之间的所有盒子状态都可以推出来。。那么怎么表示关系呢?

         很容易想到有关系就连一条边,那么就是求[1, n]之间的所有点有关系的最小花费吗?那不就是最小生成树吗?

       具体实现的话在i<->j+1连一条C[i][j]的边,求1->n+1的最小生成树。。

code:

bubuko.com,布布扣
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define Inf 0x3fffffff
 4 #define repf(i, a, b) for (int i = (a); i <= (b); ++i)
 5 const int maxn = 2003;
 6 int c[maxn][maxn], d[maxn], vis[maxn];
 7 int n;
 8 long long mst;
 9 
10 inline void read(int& ret){
11     ret = 0;
12     bool ok = 0;
13     for( ; ;){
14         int c = getchar();
15         if (c >= 0 && c <= 9) ret = (ret << 3) + (ret << 1) + c - 0, ok = 1;
16         else if (ok) return;
17     }
18 }
19 
20 void prim(){
21     mst = 0;
22     memset(vis, 0, sizeof(vis));
23     repf(i, 1, n+1) d[i] = c[1][i];
24     vis[1] = 1;
25     repf(i, 1, n){
26         int k = 0, mdis = Inf;
27         repf(j, 1, n+1) if (!vis[j] && d[j] < mdis)
28              k = j, mdis = d[j];
29         vis[k] = 1;
30         mst += mdis;
31         repf(j, 1, n+1) if (!vis[j]) 
32              d[j] = min(c[k][j], d[j]);  
33     }
34 }
35 
36 int main(){
37 //    freopen("a.in", "r", stdin);
38     while (scanf("%d", &n) != EOF){
39           repf(i, 1, n) repf(j, i+1, n+1){
40                read(c[i][j]);
41                c[j][i] = c[i][j];
42           }
43           prim();
44           cout << mst << endl;
45     }    
46 }
View Code

 

bzoj 3714

标签:style   blog   http   color   ar   os   for   sp   div   

原文地址:http://www.cnblogs.com/yzcstc/p/4073907.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!