题目链接: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. JQuery 多个ID对象绑定一个click事件

    一.表单的多个radio对象绑定click: $("#ImgRadio :radio").click(function(){ func(); });

  2. CSDN Oracle版精华帖荟萃

    ⑴ 关于大数据量的数据库设计问题http://bbs.csdn.net/topics/390382930⑵ ORA-00904标识符无效http://bbs.csdn.net/topics/39033 ...

  3. jQuery 杂项方法

    jQuery 杂项方法 方法 描述 data() 向被选元素附加数据,或者从被选元素获取数据 each() 为每个匹配元素执行函数 get() 获取由选择器指定的 DOM 元素 index() 从匹配 ...

  4. 函数还能这样玩儿~实现类似add(1)(2)(3)的函数

    人生的第一份前端工作找到了,感谢大神主子们给半路出家自学的我这么多的机会,很高兴正式踏上客观又乐趣满满的程序员之路,哇咔咔咔. ​ 分享一个准备面试时遇到的一个有趣的问题: 要求实现类似add(1)( ...

  5. [CSS]text-decoration

      定义和用法 text-decoration 属性规定添加到文本的修饰. 可能的值 值 描述 none 默认.定义标准的文本. underline 定义文本下的一条线. overline 定义文本上 ...

  6. python路径函操作

    #判断是否为文件 os.path.isfile   #判断是否为目录 os.path.isdir   #返回文件名 os.path.basename(path)   #返回文件目录 os.path.d ...

  7. SQL语句の循环添加数据

    declare @i intset @i=1while @i<=1000begininsert into News_ITM(title,msg,subDateTime,author,imageP ...

  8. 《将博客搬至CSDN》 分类: 勉励自己 2014-09-05 14:29 43人阅读 评论(0) 收藏

    搬家啦,上博客园关注我哦http://www.cnblogs.com/AsuraRoute 版权声明:本文为博主原创文章,未经博主允许不得转载.

  9. bzoj 1005: [HNOI2008]明明的烦恼 prufer编号&&生成树计数

    1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2248  Solved: 898[Submit][Statu ...

  10. Javascript禁止网页复制粘贴效果,或者复制时自动添加来源信息

    一.禁止复制 使用方法:在oncopy事件中return false oncopy="return false;" 1.禁止复制网页内容 <body oncopy=" ...