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

题目大意:

  给定n个集合,m步操作,k个种类的细菌,

  第二行给出k个数表示连续的xi个数属于i集合。

  当某个种类之间两两交换的值都为0可行解,则输出所有种类之间交换的最小值;否则输出No

解题思路:当两点之间的距离为0时并查集到一个集合中,只需保证最终同一种类的细菌都在一个并查集中则是符合条件的可行解,再用FLOYD找最短路即可

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define FFF 100005
int set[FFF];
int a[FFF];
int sw[][];
int cnt[];
int vis[FFF];
int n,k,m; int find(int x)
{
if(x==set[x])
return x;
else return set[x]=find(set[x]);
} void uion(int x,int y)
{
int l1=find(x);
int l2=find(y);
if(l1==l2)
return;
else
set[l2]=l1;
return;
} bool judge()
{
for(int l=;l<=k;l++)
{
int tmp=-;
for(int i=cnt[l-]+;i<=cnt[l];i++)
{
if(tmp==-)
tmp=find(i);
else
{
if(tmp!=find(i))
return false;
}
}
}
return true;
} void solve()
{
for(int l=;l<=k;l++)
{
for(int i=;i<=k;i++)
{
if(i!=l)
{
for(int j=;j<=k;j++)
{
if(j!=l&&j!=i)
{
if((sw[i][l]+sw[l][j]<sw[i][j]||sw[i][j]<)&&sw[i][l]>=&&sw[l][j]>=)
sw[i][j]=sw[i][l]+sw[l][j];
}
}
}
}
}
return;
} void print()
{
for(int i=;i<=k;i++)
{
sw[i][i]=;
for(int j=;j<=k;j++)
{
if(j==)
printf("%d",sw[i][j]);
else
printf(" %d",sw[i][j]);
}
cout<<endl;
}
return;
} int main()
{
int i,j,now;
scanf("%d%d%d",&n,&m,&k);
//n为点的总个数,m为边数,k为种类数
for(i=,now=;i<=k;i++)
{
int x;
scanf("%d",&x);
// 第i种细菌有x个
for( j=;j<x;j++)
{
a[j+now]=i;
set[j+now]=j+now;
}
now+=x;
cnt[i]=now-;
}
memset(sw,-,sizeof(sw));
// 两两种类之间的代价初始化成-1
while(m--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(a[x]==a[y])
//属于同一种类
{
if(z==)
uion(x,y);
// 添入并查集
}
else
//不同种类的细菌
{
if(z==)
uion(x,y);
if(sw[a[x]][a[y]]==-)
// 该两类之间还没有交换代价
sw[a[x]][a[y]]=sw[a[y]][a[x]]=z;
else if(z<sw[a[x]][a[y]])
// 新的代价较小的情况
sw[a[x]][a[y]]=sw[a[y]][a[x]]=z;
}
}
if(!judge())
// 判断同种类的细菌之间是否为0
printf("No\n");
else
{
printf("Yes\n");
solve();
// floyd找最短路
print();
}
return ;
} /*
FLOYD
题目大意:给定n个集合,m步操作,k个种类的细菌,
第二行给出k个数表示连续的xi个数属于i集合。
当某个种类之间两两交换的值都为0可行解
解题思路:当两点之间的距离为0时并查集到一个集合中,
最终保证同种细菌都在一个并查集中
再用FLOYD找最短路*/

codeforces 400D Dima and Bacteria 并查集+floyd的更多相关文章

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

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

  2. codeforces 400 D Dima and Bacteria【并查集 Floyd】

    题意:给出n个点,分别属于k个集合,判断每个集合里面的点的距离都为0,为0的话输出yes,并输出任意两个集合之间的最短路 这道题目有两个地方不会处理, 先是n个点,分别属于k个集合,该怎么记录下来这里 ...

  3. Codeforces 699D Fix a Tree 并查集

    原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...

  4. Codeforces 731C:Socks(并查集)

    http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色,问 ...

  5. Codeforces 1027F Session in BSU - 并查集

    题目传送门 传送门I 传送门II 传送门III 题目大意 有$n​$门科目有考试,第$i​$门科目有两场考试,时间分别在$a_i, b_i\ \ (a_i < b_i)​$,要求每门科目至少参加 ...

  6. CodeForces - 455C Civilization (dfs+并查集)

    http://codeforces.com/problemset/problem/455/C 题意 n个结点的森林,初始有m条边,现在有两种操作,1.查询x所在联通块的最长路径并输出:2.将结点x和y ...

  7. Codeforces 859E Desk Disorder:并查集【两个属性二选一】

    题目链接:http://codeforces.com/problemset/problem/859/E 题意: 有n个人,2n个座位. 给出这n个人初始的座位,和他们想坐的座位. 每个人要么坐在原来的 ...

  8. Codeforces 651E Table Compression【并查集】

    题目链接: http://codeforces.com/problemset/problem/650/C 题意: 给定n*m的矩阵,要求用最小的数表示每个元素,其中各行各列的大小关系保持不变. 分析: ...

  9. codeforces 456 E. Civilization(并查集+数的直径)

    题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...

随机推荐

  1. 详细介绍Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  2. SQL Server T-SQL高级查询【转】

    高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student;   --all 查询所有 select all sex from ...

  3. Maven3(笔记二)

    笔记本二   在Eclipse 中使用Maven 第一节:m2eclipse 插件安装 打开Eclipse,点击菜单Help - > Install New Software 点击Add 按钮N ...

  4. UITabBar-UITabBarItem图片的背景颜色属性和文字的颜色大小设置

    UITabBarItem设置的图片选中状态下默认的是蓝色,如何改变它的颜色为图片自带的颜色呢? typedef NS_ENUM(NSInteger, UIImageRenderingMode) { / ...

  5. 【转载】介绍“Razor”— ASP.NET的一个新视图引擎

    最近在做一个项目,用的MVC razor 视图,因为之前没用这个视图做过,于是查阅文档资料,共享一下. https://msdn.microsoft.com/zh-cn/ff849693 内容主要是讲 ...

  6. js原型解析

    我们都知道javascript因为具有了继承以及变量等等一系列的特性之后才被人们认为具有一门编程语言的资格,在后续的不断发展中,js在原生的基础上扩展了基于jquery等等的库,甚至衍生了像node. ...

  7. ZOJ 2432 Greatest Common Increasing Subsequence(最长公共上升子序列+路径打印)

    Greatest Common Increasing Subsequence 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problem ...

  8. 『重构--改善既有代码的设计』读书笔记----Change Value to Reference

    有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...

  9. jquery 属性与css操作

    属性1.属性    1.1 attr(name|properties|key,value|key,fn)        1) 获取属性值    $("img").attr(&quo ...

  10. ZendFramework使用中常见问题

    MVC 代码书写:控制器代码书写:<?phpclass IndexController extends Zend_Controller_Action{ function init() { $th ...