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

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
#define INF 1000000007
#define N 100005
int n, m, k;
int r[N];
int f[N];
int v;
int u;
int x;
int ra[N];
int dp[505][505];
int fd(int y){if(f[y] == y)return y;return f[y] = fd(f[y]);
}
void uni(int i, int j){i = fd(i);j = fd(j);if(i == j) return ;if(ra[i] < ra[j]){f[i] = j;}else {f[j] = i; if(ra[i] == ra[j])ra[i] ++;}
}
int main(){scanf("%d%d%d", &n, &m, &k);int ptr = 0;for(int i = 0; i < k; i++){int c;scanf("%d", &c);while(c --){r[ptr ++] = i;}}for(int i = 0; i < n; i++){f[i] = i;ra[i] = 0;}memset(dp, -1, sizeof(dp));for(int i = 0; i < k; i++)dp[i][i] = 0;for(int i = 0; i < m; i++){scanf("%d%d%d", &v, &u, &x);v--; u--;//注意if(dp[r[v]][r[u]] != -1) dp[r[u]][r[v]] = dp[r[v]][r[u]] = min(dp[r[v]][r[u]], x);else dp[r[u]][r[v]] = dp[r[v]][r[u]] = x;if(x == 0){uni(v, u);}}int flag = 0;for(int i = 1; i < n; i++){if(r[i] == r[i - 1] && fd(i) != fd(i - 1)){flag = 1;break;}}if(flag){printf("No\n");return 0;}printf("Yes\n");for(int i = 0; i < k; i++){//ij连接经过k个点for(int j = 0; j < k; j++){for(int l = 0; l < k; l++){if(j == l) continue;if(dp[j][i] == -1 || dp[i][l] == -1) continue;if(dp[j][l] != -1) dp[j][l] = min(dp[j][l], dp[j][i] + dp[i][l]);else dp[j][l] = dp[j][i] + dp[i][l];}}}for(int i = 0; i < k; i++){for(int j = 0; j < k; j++)printf("%d ", dp[i][j]);printf("\n");}return 0;
}

CF 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. TTTTTTTTTTT 400D Dima and Bacteria 细菌 最短路

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

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

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

  4. CodeForces 400D Dima and Bacteria

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

  5. codeforces 400D - Dima and Bacteria

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意:n个培养基,m种仪器,分成k种,每种细菌数量c[i],然后就给出从第i到第j个培养基转 ...

  6. cf D. Dima and Hares

    http://codeforces.com/contest/358/problem/D 题意:ai代表相邻的两个野兔都没有吃食物情况下的快乐系数,bi代表的是在相邻的两个野兔中有一个吃到食物的快乐系数 ...

  7. CF400D Dima and Bacteria(并查集+Floyd)

    首先判断是否可行,把0边链接的点都合并起来,看每一种类的所有点是不是都在一个集合内.然后缩成500个点,跑Floyd即可. #include <bits/stdc++.h> using n ...

  8. CF400D Dima and Bacteria【并查集】

    题意:N个细菌,分成K种,每种C个,比如5个细菌,分为2种,C分别为2.3,那么1.2一类,3.4.5一类.有m边条u.v.c,u v之间花费为c.如果同一种细菌之间的任意两个花费不为0,输出No:否 ...

  9. Dima and Bacteria

    题目链接 不难,相同种类的距离是否为零用并查集判断.之后用floyd判断 int ind[600], father[MAXN], dis[600][600]; int number, kase, ty ...

最新文章

  1. ubuntu 设置大小写切换隐藏_VirtualBox中ubuntu的LAMP项目(温度采集)
  2. Spring 基于 Java 的配置
  3. spring 注释_Spring @Value注释
  4. java.lang.NoClassDefFoundError:如何解决–第1部分
  5. Quorum 和唱票那回事
  6. MRC522(2):超简易门禁
  7. PC自增与转移地址计算问题总结
  8. linux已开机时间,Linux查看系统开机时间
  9. 概率Probability的本质是什么?[附概率基础知识,文末可下载28页PDF]
  10. 测试网站速度的8款免费工具推荐
  11. linux服务器默认使用中文字符集zh_CN.UTF-8
  12. Win7+IE8页面兼容性问题解决之DOCTYPE声明
  13. 大学生如何培育计算机思维,计算机思维下的计算机课程改革思路探索
  14. iOS打包错误The operation couldn’t be completed. (AppThinning.StubError error 1.)
  15. 新建git分支(歪门邪道)
  16. Jextson tx2,AGX xavier,GTX 1080Ti,Quadro P4000, i5 cpu,计算能力对比
  17. linux 单机安装yum,Linux搭建Nacos服务(单机版)
  18. 数据结构实验——串的加密
  19. 大话C#的进阶业务场景必知点解析 第8节 算法上道C#根据时间起卦像程序
  20. idea右边找不到maven窗口不见了的多种解决方法

热门文章

  1. 关于CopperCAM最新版工具v07/09/2017的破解过程
  2. QT 自定义分页控件
  3. 编写函数求解圆台的表面积s和体积v
  4. 【深蓝学院:语音信号处理笔记】前端语音处理技术综述
  5. 京东热 Key 0.4 发布,单机 QPS 提升至 35 万
  6. [BZOJ1061] [NOI2008] 志愿者招募 - 最小费用最大流
  7. Centrex业务-呼叫等待
  8. 如何使用BackTrack破解WIFI无线网络的WEP密钥
  9. 解套方案——1.6黄金独家操作建议,纸白银价格趋势精准解析
  10. least和greatest