题意: 题目大意:给出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,如果正确的话,给出两两细菌(种类)间移动能量的最小值。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
const int mod=100000000;
struct edge{int to,c;
};
vector<edge> G[100600];
int c[100600],f[100600],be[100600],dist[600][600],n,m,k;
void add_edge(int u,int v,int c)
{G[u].push_back((edge){v,c});G[v].push_back((edge){u,c});
}int findr(int u)
{if(f[u]!=u)f[u]=findr(f[u]);return f[u];
}bool legal()
{for(int i=1;i<=k;i++){int r=findr(c[i-1]+1);for(int j=c[i-1]+2;j<=c[i];j++)if(r!=findr(j)) return false;}return true;
}int main()
{while(~scanf("%d %d %d",&n,&m,&k)){for(int i=1;i<=n;i++) {G[i].clear();f[i]=i;}for(int i=1;i<=k;i++){scanf("%d",&c[i]);c[i]+=c[i-1];for(int j=c[i-1]+1;j<=c[i];j++)be[j]=i;}MM(dist,inf);for(int i=1;i<=m;i++){int u,v,c;scanf("%d %d %d",&u,&v,&c);add_edge(u,v,c);if(!c){int ru=findr(u);int rv=findr(v);if(ru!=rv) f[rv]=ru;}}if(!legal()) {printf("No\n");continue;};for(int i=1;i<=n;i++)for(int j=0;j<G[i].size();j++){int u=i,v=G[i][j].to;if(dist[be[u]][be[v]]>G[i][j].c)dist[be[v]][be[u]]=dist[be[u]][be[v]]=G[i][j].c;}for(int w=1;w<=k;w++)for(int i=1;i<=k;i++)for(int j=1;j<=k;j++)dist[i][j]=min(dist[i][j],dist[i][w]+dist[w][j]);printf("Yes\n");for(int i=1;i<=k;i++)for(int j=1;j<=k;j++){if(i==j)printf("0 ");else if(dist[i][j]==inf)printf("-1 ");elseprintf("%d ",dist[i][j]);if(j==k)printf("\n");}}return 0;
}

  并查集+floyd

wa代码,好好查错:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
const int mod=100000000;
struct edge{int to,c;
};
vector<edge> G[100005];
int c[100005],f[100005],n,m,k;
void add_edge(int u,int v,int c)
{G[u].push_back((edge){v,c});G[v].push_back((edge){u,c});
}int findr(int u)
{if(f[u]!=u) return findr(f[u]);
}bool legal()
{for(int i=1;i<=k;i++){int r=findr(c[i-1]+1);for(int j=c[i-1]+2;j<=c[i];j++)if(r!=findr(j)) return false;}return true;
}int main()
{while(~scanf("%d %d %d",&n,&m,&k)){for(int i=1;i<=n;i++) {G[i].clear();f[i]=i;}for(int i=1;i<=k;i++) {scanf("%d",&c[i]);c[i]+=c[i-1];}for(int i=1;i<=m;i++){int u,v,c;scanf("%d %d %d",&u,&v,&c);add_edge(u,v,c);if(!c){int ru=findr(u);int rv=findr(v);if(ru!=rv) f[rv]=ru;}}if(!legal()) {printf("No\n");continue;};}return 0;
}

  

转载于:https://www.cnblogs.com/smilesundream/p/5402560.html

TTTTTTTTTTT 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

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

  3. CF 400D Dima and Bacteria

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

  4. CodeForces 400D Dima and Bacteria

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

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

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

  6. 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:否 ...

  7. 【CodeForces 】 400D(并差集+Floyd最短路)

    题目链接:https://codeforces.com/problemset/problem/400/D 题意:给出 n 个细菌,m 种仪器,细菌有 k 种,每种细菌数量 c[i],给出从第 ui 细 ...

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

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

  9. Dima and Bacteria

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

最新文章

  1. List数组,string数组,Dictionary字典三种contain方法的查询速度
  2. 翁恺c语言第6周编程答案,程序设计入门——C语言 第6周编程练习 1 分解质因数(5分)(示例代码)...
  3. 451. 根据字符出现频率排序golang
  4. C#中事务的简单使用
  5. 迷宫问题(栈解决)--2015年8月9日19:23:23v1.0版
  6. html+css基础-4-html标签、Doctype、iframe,table布局
  7. Windows Server2008安装VC++2015运行库失败的解决方案
  8. 国内银行简码表(json)
  9. 光纤交换机 序列号_FAQ-如何查询设备的SN号
  10. OpenGL学习整理------着色器
  11. python将xls格式转成xlsx格式
  12. ATN项目(智能矩阵Atmatrix)是否能做到人工智能界的桥梁,从而改变世界?
  13. aqs clh java_并发编程——详解 AQS CLH 锁
  14. r7 6700g核显相当于什么显卡 锐龙r76700g性能怎么样
  15. chatGPT 与文言一心的对比
  16. [计算机视觉] AprilTag: A robust and flexible visual fiducial system(2011)论文理解
  17. 什么是枚举?(个人理解)
  18. java 时间片_时间片-简介
  19. python中exception方法_python中try except处理程序异常的三种常用方法
  20. 飞蛾投火式的瞬间灿烂

热门文章

  1. MySQL表字段数量限制以及行大小限制
  2. 信号与系统--信号以及系统的介绍(一)
  3. 大胆冲数学建模勘误表
  4. A reference for learning process
  5. 从时间管理到管理情绪,这些自我管理的技巧你知道几个?
  6. java 一笔一划 写汉字_基于Web的汉字一笔一划书写方法
  7. 希尔排序大详解,保证10分钟内学会希尔排序(进化版插入排序)
  8. 小滕要开始学习C语言啦
  9. Artificial Intelligence 人工智能 AI search AI 搜索
  10. 【转】我们从来都不是我们自己。