codeforces 400D Dima and Bacteria 并查集+floyd
题目链接: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的更多相关文章
- 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 D Dima and Bacteria【并查集 Floyd】
题意:给出n个点,分别属于k个集合,判断每个集合里面的点的距离都为0,为0的话输出yes,并输出任意两个集合之间的最短路 这道题目有两个地方不会处理, 先是n个点,分别属于k个集合,该怎么记录下来这里 ...
- Codeforces 699D Fix a Tree 并查集
原题:http://codeforces.com/contest/699/problem/D 题目中所描述的从属关系,可以看作是一个一个块,可以用并查集来维护这个森林.这些从属关系中会有两种环,第一种 ...
- Codeforces 731C:Socks(并查集)
http://codeforces.com/problemset/problem/731/C 题意:有n只袜子,m天,k个颜色,每个袜子有一个颜色,再给出m天,每天有两只袜子,每只袜子可能不同颜色,问 ...
- Codeforces 1027F Session in BSU - 并查集
题目传送门 传送门I 传送门II 传送门III 题目大意 有$n$门科目有考试,第$i$门科目有两场考试,时间分别在$a_i, b_i\ \ (a_i < b_i)$,要求每门科目至少参加 ...
- CodeForces - 455C Civilization (dfs+并查集)
http://codeforces.com/problemset/problem/455/C 题意 n个结点的森林,初始有m条边,现在有两种操作,1.查询x所在联通块的最长路径并输出:2.将结点x和y ...
- Codeforces 859E Desk Disorder:并查集【两个属性二选一】
题目链接:http://codeforces.com/problemset/problem/859/E 题意: 有n个人,2n个座位. 给出这n个人初始的座位,和他们想坐的座位. 每个人要么坐在原来的 ...
- Codeforces 651E Table Compression【并查集】
题目链接: http://codeforces.com/problemset/problem/650/C 题意: 给定n*m的矩阵,要求用最小的数表示每个元素,其中各行各列的大小关系保持不变. 分析: ...
- codeforces 456 E. Civilization(并查集+数的直径)
题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...
随机推荐
- Using native GDI for text rendering in C#
Using native GDI for text rendering in C# Aug12by Arthur To complete my previous post on text render ...
- Object-C Init
上一篇为Object-C类实现 我们可以创建一个init方法用来给我们的实例变量设置初始化值: - (id)init { if(self = [super init]) { [self setCapt ...
- Jquery插件之信息弹出框showInfoDialog(成功、错误、警告、通知)
一.信息种类说明: 1.1.操作成功信息 1.2.错误信息 1.3.警告信息 1.4.通知信息 二.使用说明 <!DOCTYPE html PUBLIC "-//W3C//DTD HT ...
- 【Java多线程与并发库】4.传统线程同步通信技术
我们先通过一道面试题来了解传统的线程同步通信. 题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序. 我没有看答案, ...
- Android Activity与Service的交互方式
参考: http://blog.csdn.net/gebitan505/article/details/18151203 实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通 ...
- Find your present (2) (位异或)
Problem Description In the new year party, everybody will get a "special present".Now it's ...
- g++的常用参数
-c 编译成目标文件.o-o 指定输出文件名,输出文件名跟在-o后面,用空格分隔.如果不使用这个选项,缺省的输出文件名为a.out.-g 产生有调试信息的可执行文件-w 不产生警告信息-l 连接指定的 ...
- tcpdump 本机回环,应该用tcpdump -i lo
tcpdump 本机回环,应该用tcpdump -i lo
- HNOI2015滚粗记
HNOI2015滚粗记 经过两天的苦战,艰难的HNOI终于结束了.感觉这次HNOI自己还是收获了许多. \(Day1\)打的很是艰难,题目一下就有种晕头转向的感觉.开场\(20min\)自己还在读题时 ...
- BZOJ 3677 连珠线
Description 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或蓝色的,珠子被编号为\(1\)到\(n\).这个游戏从一个珠子开始,每次会用如下方式添加 ...