codeforces 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,如果正确的话,给出两两细菌(种类)间移动能量的最小值。
思路:并差集+floyd;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100010
using namespace std;
const int inf=<<; int n,m,k;
int g[][];
int c[maxn];
int f[maxn],u[maxn],v[maxn],x[maxn];
int num[maxn];
int xx[maxn];
int sum[maxn]; int Find(int x)
{
if(x==f[x]) return x;
return f[x]=Find(f[x]);
} int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int fx,fy;
for(int i=; i<=k; i++)
{
scanf("%d",&c[i]);
sum[i]=sum[i-]+c[i];
}
for(int i=; i<=n; i++)
{
f[i]=i;
}
for(int i=; i<=k; i++)
{
for(int j=sum[i-]+; j<=sum[i]; j++)
{
xx[j]=i;
}
}
for(int i=; i<=m; i++)
{
scanf("%d%d%d",&u[i],&v[i],&x[i]);
int uu=u[i],vv=v[i];
if(uu>vv) swap(uu,vv);
fx=Find(uu);
fy=Find(vv);
if(x[i]==)
{
if(fx!=fy)
{
f[fy]=fx;
}
}
}
bool flag=false;
for(int i=; i<=k; i++)
{
int x=Find(sum[i-]+);
int cnt=;
for(int j=sum[i-]+; j<=sum[i]; j++)
{
if(Find(j)==x) cnt++;
}
if(cnt!=c[i])
{
flag=true;
break;
}
}
if(flag)
{
printf("No\n");
}
else
{
for(int i=; i<=k; i++)
{
for(int j=; j<=k; j++)
{
if(i==j) g[i][j]=;
else g[i][j]=inf;
}
}
for(int i=; i<=m; i++)
{
g[xx[u[i]]][xx[v[i]]]=min(g[xx[u[i]]][xx[v[i]]],x[i]);
g[xx[v[i]]][xx[u[i]]]=min(g[xx[v[i]]][xx[u[i]]],x[i]);
}
for(int c=; c<=k; c++)
{
for(int i=; i<=k; i++)
{
if(i==c)continue;
for(int j=; j<=k; j++)
{
if(i==j||j==c) continue;
g[i][j]=min(g[i][j],g[i][c]+g[c][j]);
}
}
}
printf("Yes\n");
for(int i=; i<=k; i++)
{
for(int j=; j<=k; j++)
{
if(g[i][j]==inf&&i!=j)
{
printf("-1 ");
}
else printf("%d ",g[i][j]);
}
printf("\n");
}
}
}
return ;
}
codeforces Dima and Bacteria的更多相关文章
- codeforces 400D Dima and Bacteria 并查集+floyd
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...
- codeforces 400 D Dima and Bacteria【并查集 Floyd】
题意:给出n个点,分别属于k个集合,判断每个集合里面的点的距离都为0,为0的话输出yes,并输出任意两个集合之间的最短路 这道题目有两个地方不会处理, 先是n个点,分别属于k个集合,该怎么记录下来这里 ...
- Codeforces 579A. Raising Bacteria
You are a lover of bacteria. You want to raise some bacteria in a box. Initially, the box is empty. ...
- Codeforces400D Dima and Bacteria
题意:给你一个无向有权的图,图上的点被分成了几类,对于同类的点你需要判断它们之间相互的最短距离是不是0.满足这个条件之后要输出的是类与类之间的最短距离的矩阵.点给到10^5这么多,判断同类的点显然不能 ...
- TTTTTTTTTTT 400D Dima and Bacteria 细菌 最短路
题意: 题目大意:给出n,m和k,表示有n个细菌,m种仪器和k种细菌,给出k种细菌的数量ci,然后每个细菌按照种类排成一排(所以有第i种细菌的序号从∑(1≤j≤i-1)cj + 1 到∑(1≤j≤i) ...
- CodeForces 400
A - Inna and Choose Options Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d &a ...
- Codeforces Round #234 (Div. 2)
A. Inna and Choose Options time limit per test 1 second memory limit per test 256 megabytes input st ...
- Codeforces Round#320 Div2 解题报告
Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...
- SDKD 2017 Summer Single Training #03
今天的题目有 6 个. 第一题: CodeForces - 400D Dima and Bacteria 这个题实际是不难的,难的可能在题意的理解上还有题干有点长,这个题很考察题意上面,知识点很熟悉 ...
随机推荐
- cocos2d-x 3.0 final 中文显示
cocos2d-x 3.0的中文显示非常easy,首先,你须要一个xml文件保存中文,还须要一个能显示中文的TTF文件 <?xml version="1.0" encodin ...
- 树莓派安装mjpg-streamer视频监控 分类: Raspberry Pi 2015-04-12 23:41 144人阅读 评论(0) 收藏
原来使用Motion在树莓派上跑1280x720分辨率的三颗摄像头.占用内存太严重,关闭诸多功能之后还是不行.故转战mjpg-streamer. 首先安装所需软件 sudo apt-get insta ...
- 习WebSocket一(WebSocket初识)[转]
http://www.cnblogs.com/wgp13x/p/3812579.html Java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tom ...
- RSA算法详解及C语言实现
RSA算法它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman.但 ...
- Java 理论与实践: 非阻塞算法简介--转载
在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保 ...
- Unity3D 游戏的碰撞
首先创建两个精灵,然后都绑定上碰撞方法(这个是在上一篇文章的基本上): 不过 要注意一点就是碰撞器需要挂一个重力组件,不然无效 所以添加了差不多就能够实现物体碰撞了: 接下来技术写代码,让碰撞的时候进 ...
- angularjs-ngModel传值问题
js NiDialog.open({ windowClass: '', backdrop: 'static', keyboard: false, templateUrl: '/static/tpl/a ...
- C# - string 转为 DateTime(自定义)
上代码: string dt = " 1 11 1961"; DateTime day; System.Globalization.DateTimeFormatInfo dtFor ...
- .NET 4.6
http://referencesource.microsoft.com/ DownLoad 下载原代码
- linux 命令学习(4)
Linux中常用的关机和重新启动命令有shutdown.halt.reboot以及init,它们都可以达到关机和重新启动的目的,但是每个命令的内部工作过程是不同的,下面将逐一进行介绍. 1. shut ...