题目链接:http://codeforces.com/problemset/problem/400/D

题目大意:n个培养基,m种仪器,分成k种,每种细菌数量c[i],然后就给出从第i到第j个培养基转化需要的花费。判断同种培养基之间的转化是不是都是可以0花费,如果可以再输出不同种培养基之间转化的最小花费。

如果有疑惑的话,再以样例解释一下——

4 4 2
1 3
2 3 0
3 4 0
2 4 1
2 1 2

_____

Yes
0 2
2 0

4个培养皿,4种转换路径,分成2种,第一种细菌的数量为1,第二种的细菌数量为3,即1号培养皿为种类①,2、3、4号培养皿为种类②;

2号培养皿<->3号培养皿=0花费

3号培养皿<->4号培养皿=0花费

2号培养皿<->4号培养皿=1花费

2号培养皿<->1号培养皿=2花费

因此同种培养皿可以0花费相互转换,两个集合间的转换的最小花费为2。

题目分析:关于同种培养皿之间是否可以互相转换,我们用并查集将花费为0的两个点加入一个集合;而判断yes or no的时候我们就看一下同一种类的点是不是已经在一个集合了;最后的最短路就用floyd计算了。

代码参考:

#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 9;
int c[N];
struct Node
{int u, v, x;
} Edge[N];
int p[N];
int find(int x)
{return p[x] < 0 ? x : p[x] = find(p[x]);
}
void un(int a, int b)
{int x = find(a), y = find(b);if (x != y){p[x] = y;}
}
int sum[N];
int dis[555][555];
int id[N];
void checkMin(int & a, int b)
{if (a > b){a = b;}
}
const int INF = 1e9;
int main()
{int n, m, k, i, j;while (~scanf("%d%d%d", &n, &m, &k)){memset(p, -1, sizeof(p));for (i = 1; i <= k; ++i){for (j = 1; j <= k; ++j){dis[i][j] = INF;}dis[i][i] = 0;}sum[0] = 0;for (i = 1; i <= k; ++i){scanf("%d", &c[i]);sum[i] = sum[i - 1] + c[i];//sum[i]代表前i种的总数量,sum[1]=c[1] ,sum[2]=c[1]+c[2]for (j = sum[i - 1] + 1; j <= sum[i]; ++j){id[j] = i;//1~c[1]染成颜色0, c[1]+1~c[2]染成颜色1}}for (i = 0; i < m; ++i){scanf("%d%d%d", &Edge[i].u, &Edge[i].v, &Edge[i].x);int a = Edge[i].u, b = Edge[i].v, c = Edge[i].x;if (Edge[i].x == 0)//如果当前仪器x为0,就将两个序号的细菌连接连接(并查集){un(Edge[i].u, Edge[i].v);}//种类之间的最小花费预处理checkMin(dis[id[a]][id[b]], c);checkMin(dis[id[b]][id[a]], c);}bool zeroDis = true;for (i = 1; i <= k; ++i){for (j = sum[i - 1] + 2; j <= sum[i]; ++j){if (find(j) != find(sum[i - 1] + 1))//如果sum[i-1]+1与sum[i-1]+2,sum[i-1]+3,……,其中有一个的root不一样的话则不正确{zeroDis = false;}}}if (!zeroDis){puts("No");continue;}int t;//floydfor (t = 1; t <= k; ++t){for (i = 1; i <= k; ++i){for (j = 1; j <= k; ++j){checkMin(dis[i][j], dis[i][t] + dis[t][j]);}}}puts("Yes");for (i = 1; i <= k; ++i){for (j = 1; j <= k; ++j){if (dis[i][j] == INF){dis[i][j] = -1;}printf("%d ", dis[i][j]);}puts("");}}return 0;
}

codeforces 400D - Dima and Bacteria相关推荐

  1. codeforces 400D Dima and Bacteria 并查集+floyd

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...

  2. Codeforces 400D Dima And Bacteria 暴力+Floyd

    题意:n点,m条带权边的无向图,每个顶点属于k类中的某一类,定义合法,同一类中的任意两点存在代价为0的路径,若合法,求出d[i][j]矩阵,表示第i类到第j类的最小代价. n,m<=1e5,k& ...

  3. CodeForces 400D Dima and Bacteria

    题意: 有n个点  它们有自己的type  给出m条边  首先要求判断可否用0费用在同样type的点中走  如果可以  用type为点建图求任意两点最短路 思路: type只有500种  最后一步可以 ...

  4. TTTTTTTTTTT 400D Dima and Bacteria 细菌 最短路

    题意: 题目大意:给出n,m和k,表示有n个细菌,m种仪器和k种细菌,给出k种细菌的数量ci,然后每个细菌按照种类排成一排(所以有第i种细菌的序号从∑(1≤j≤i-1)cj + 1 到∑(1≤j≤i) ...

  5. CF 400D Dima and Bacteria

    最短路问题.先求是否和谐,即内部成员之间可0权连接.并查集解决.然后弗洛伊德算法解决.注意点从0开始,在读入点时记得减1.第一个最短路.注意最外层循环不可以内置,必须遵循此顺序. #include & ...

  6. CODEFORCES 272C Dima and Staircase 细节理解题+简单技巧

    传送门:http://codeforces.com/problemset/problem/272/C C. Dima and Staircase time limit per test 2 secon ...

  7. Codeforces - 272C Dima and Staircase(思维)

    题目链接---- Dima's got a staircase that consists of n stairs. The first stair is at height a1, the seco ...

  8. CodeForces - 272C Dima and Staircase (线段树区间更新)

    题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...

  9. CodeForces - 366C Dima and Salad

    Dima and Salad 题 意 :有n个物品,价值为val[i],重量为cost[i],问最后背包中物品价值和比重量和为k的最大价值. 数据范围: 1<=n<=100 1<=k ...

最新文章

  1. notepad++及Scintilla
  2. 【重磅】斯坦福李飞飞最新《注意力与Transformer》总结,84页ppt下载!
  3. Python3.6 安装 statsmodels
  4. Android动态控制状态栏显示和隐藏
  5. mysql实现表单号:表单编码+时间+表单号
  6. SAP云平台上的ABAP编程环境能做哪些事情
  7. uva 11925——Generating Permutations
  8. 初识react(二) 实现一个简版的html+redux.js的demo
  9. iOS-MVVM-模式介绍
  10. HTML+CSS+JS实现 ❤️slicebox酷炫3d图片轮播切换❤️
  11. 查看pcl版本 linux,Ubuntu16上安装PCL
  12. ImageFolder使用方法
  13. 2020统计局的行政划分表_天津市第七次全国人口普查区域划分与地图绘制试点工作在西青区开展...
  14. NTP原理及配置使用
  15. 冒泡排序算法详解之C语言版
  16. 数据库系统概论第五版(第 4 章 数据库安全性)笔记
  17. 〔翻译〕摩托罗拉E680的linux系统解码
  18. Gitlab实战3:Gitlab用户注册及管理
  19. python之禅怎么读_混为一谈的读音
  20. C++程序设计作业--坦克大战[分享]

热门文章

  1. windows10本地部署PHP
  2. 数据库系统(上):模型与语言 第3讲-关系模型之基本概念
  3. RV1126按键中断驱动和应用调试
  4. 使用光纤网络安装监控摄像头的6套方案
  5. cpalgotithm安装大坑
  6. myeclipse 10.7.1下载地址
  7. 小尼机器人_机器人卖车?“小尼”已悄悄的来到了深圳
  8. 我应该是懂居家办公的吧?
  9. Java面试流程及核心面试题
  10. 主动减负的“蚂蚁兵团”,还能成为“大象”吗?