TTTTTTTTTTT 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,如果正确的话,给出两两细菌(种类)间移动能量的最小值。
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 细菌 最短路相关推荐
- codeforces 400D Dima and Bacteria 并查集+floyd
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...
- codeforces 400D - Dima and Bacteria
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意:n个培养基,m种仪器,分成k种,每种细菌数量c[i],然后就给出从第i到第j个培养基转 ...
- CF 400D Dima and Bacteria
最短路问题.先求是否和谐,即内部成员之间可0权连接.并查集解决.然后弗洛伊德算法解决.注意点从0开始,在读入点时记得减1.第一个最短路.注意最外层循环不可以内置,必须遵循此顺序. #include & ...
- CodeForces 400D Dima and Bacteria
题意: 有n个点 它们有自己的type 给出m条边 首先要求判断可否用0费用在同样type的点中走 如果可以 用type为点建图求任意两点最短路 思路: type只有500种 最后一步可以 ...
- Codeforces 400D Dima And Bacteria 暴力+Floyd
题意:n点,m条带权边的无向图,每个顶点属于k类中的某一类,定义合法,同一类中的任意两点存在代价为0的路径,若合法,求出d[i][j]矩阵,表示第i类到第j类的最小代价. n,m<=1e5,k& ...
- 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:否 ...
- 【CodeForces 】 400D(并差集+Floyd最短路)
题目链接:https://codeforces.com/problemset/problem/400/D 题意:给出 n 个细菌,m 种仪器,细菌有 k 种,每种细菌数量 c[i],给出从第 ui 细 ...
- CF400D Dima and Bacteria(并查集+Floyd)
首先判断是否可行,把0边链接的点都合并起来,看每一种类的所有点是不是都在一个集合内.然后缩成500个点,跑Floyd即可. #include <bits/stdc++.h> using n ...
- Dima and Bacteria
题目链接 不难,相同种类的距离是否为零用并查集判断.之后用floyd判断 int ind[600], father[MAXN], dis[600][600]; int number, kase, ty ...
最新文章
- List数组,string数组,Dictionary字典三种contain方法的查询速度
- 翁恺c语言第6周编程答案,程序设计入门——C语言 第6周编程练习 1 分解质因数(5分)(示例代码)...
- 451. 根据字符出现频率排序golang
- C#中事务的简单使用
- 迷宫问题(栈解决)--2015年8月9日19:23:23v1.0版
- html+css基础-4-html标签、Doctype、iframe,table布局
- Windows Server2008安装VC++2015运行库失败的解决方案
- 国内银行简码表(json)
- 光纤交换机 序列号_FAQ-如何查询设备的SN号
- OpenGL学习整理------着色器
- python将xls格式转成xlsx格式
- ATN项目(智能矩阵Atmatrix)是否能做到人工智能界的桥梁,从而改变世界?
- aqs clh java_并发编程——详解 AQS CLH 锁
- r7 6700g核显相当于什么显卡 锐龙r76700g性能怎么样
- chatGPT 与文言一心的对比
- [计算机视觉] AprilTag: A robust and flexible visual fiducial system(2011)论文理解
- 什么是枚举?(个人理解)
- java 时间片_时间片-简介
- python中exception方法_python中try except处理程序异常的三种常用方法
- 飞蛾投火式的瞬间灿烂