题目链接:Codeforces 400D Dima and Bacteria
题目大意:给出n,m和k,表示有n个细菌,m种仪器和k种细菌,给出k种细菌的数量ci,然后每个细菌按照种类排成一排(所以有第i种细菌的序号从∑(1≤j≤i-1)cj + 1 到∑(1≤j≤i)cj);接下来给出m种仪器,有u,v,x三个值,表示说从可以在第u,v号细菌之间移动能量,代价为x。请帮助博士判断说这些细菌是否正确,正确的前提条件是说同种细菌之间移动能量为0,如果正确的话,给出两两细菌(种类)间移动能量的最小值。
解题思路:题目有点长,琢磨了很久,要注意的是当前细菌可以先移动到其它细菌上。我的做法是,如果当前仪器x为0,就将两个序号的细菌连接连接(并查集),然后在判断是否正确的时候,只要同一种细菌处于同以集合即可。然后处理最短路径就用Floyd算法。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e5+5;
const int K = 505;
const int INF = 0x3f3f3f3f;
int n, m, k, t[N], f[N];
int c[K], d[K][K];
int getfar(int x) {
return x == f[x] ? x : f[x] = getfar(f[x]);
}
void init () {
scanf("%d%d%d", &n, &m, &k);
memset(d, INF, sizeof(d));
for (int i = 1; i <= n; i++) f[i] = i;
int p = 1, u, v, x;
for (int i = 1; i <= k; i++) {
scanf("%d", &c[i]);
for (int j = 0; j < c[i]; j++) t[p++] = i;
}
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &x);
int ui, vi;
if (x == 0) {
ui = getfar(u);
vi = getfar(v);
if (ui != vi) f[vi] = ui;
}
ui = t[u]; vi = t[v];
d[ui][vi] = d[vi][ui] = min(d[ui][vi], x);
}
}
bool judge () {
int p = 1;
for (int i = 1; i <= k; i++) {
int u = getfar(p);
for (int j = 0; j < c[i]; j++) {
int v = getfar(p);
if (v != u) return false;
p++;
}
}
return true;
}
void solve () {
for (int i = 1; i <= k; i++) d[i][i] = 0;
for (int x = 1; x <= k; x++) {
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= k; j++) {
d[i][j] = min(d[i][j], d[i][x] + d[x][j]);
}
}
}
}
int main () {
init ();
if (judge()) {
solve ();
printf("Yes\n");
for (int i = 1; i <= k; i++) {
for (int j = 1; j < k; j++) printf("%d ", d[i][j] != INF ? d[i][j] : -1);
printf("%d\n", d[i][k] != INF ? d[i][k] : -1);
}
} else
printf("No\n");
return 0;
}
分享到:
相关推荐
解决问题(문제해결) ACM-ICPC凭证,BOJ,CodeForces,Codewars,SCPC,摇动,TopCoder凭证
【并查集】Codeforces 566D Restructuring Company题面在这里对于本题,只需要再维护一个并查集表示i所在联通块的最右位置因为相邻
Codeforces 题库 101-200 共~500题 codeforces.com版权所有。 程序可提交至该网站评测。
# sublime-plugin-for-codeforces 自定义构建,用于从 codeforces 获取测试用例并检查程序是否正确。 平台:GNU/Linux 语言:Python2.7.9 描述:这个程序从 codeforces 中获取测试用例,并告诉你程序的输出是否与...
268C Beautiful Sets of Points 传送门 题意:在n*m的格点图里尽量多的选点,使点之间两两距离不为整数,同时不能选(0,0). 构造水题了,很明显每行/列最多放一个,那么最多应该放min(n,m)+1个,由于0,0不能选,直接...
Codeforces 题库 001-100 共~500题 codeforces.com版权所有。 程序可提交至该网站评测。
codeforces编程网站预测分数插件
波兰球和游戏: ://codeforces.com/problemset/problem/755/B 问题779 B.怪异的舍入: : 问题845 A.国际象棋锦标赛: : 问题884 B.日语填字游戏反击: : 问题985 A.国际象棋的放置: : 问题1042 A.长凳: : 问题1105...
codeForces C ++中的Code Force解决方案
暴枚最长桌脚的长度$l$,然后长度比$l$长的桌脚全部都要砍掉长度比$l$短的桌脚选择代价前$k$小的砍掉用线段树维护;示例程序 :typedef long l
Codeforces Round #620 (Div. 2) [codeforces 1304A] Two Rabbits 整除+模 总目录详见https://blog.csdn.net/mrcrack/article/details/103564004 在线测评地址https://codeforces.ml/contest/1304/problem/A ...
使用于Google Chrome的Codeforces Enhancer 1.1.2插件安装包。 版本:codeforces enhancer 1.1.2 使用浏览器:Google Chrome
一个Codeforces、牛客竞赛、AtCoder平台的编程竞赛查询插件,ACMer必备.zip
Codeforces扩展包 是否曾经想让Codeforce拥有方便的快捷键,自动更新排行榜,可以按需隐藏/显示的问题标签,更好的站点导航,深色主题或以上所有功能? 这些和更多功能可以在Codeforces ++中获得! 该扩展是开源的,...
Codeforces 185A - Plant 全测试点49个
lucifer1004大佬的博客cf上分攻略故里大佬的githubcf思维题刷题数:44- (1421)codeforces 676 div2 A,B done
codeforces 19 E Fairy 一道比较难的题目的解题报告 推荐阅读
Codeforces global round 10 codes
Codeforces 1105B - Zuhair and Strings 测试点37个(全)
编码 C ++中的Codeforce问题的解决方案