首页 > 代码库 > bzoj 3714
bzoj 3714
题意: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:
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 }
bzoj 3714
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。