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所在的联通块的最 ...
随机推荐
- c# ADO连接Access 执行Open后程序自动退出
今天利用ADO连接Access数据库的时候遇到了前所未见的问题,Access数据库连接串,OleDbConnection,open的时候,系统就会自动关闭所有调试. 我就很纠结了,这个AccessHe ...
- winform程序中界面的跳转问题
首先是我们进行窗口间的跳转,尤其注意的是winform程序里面的空间都是中线程安全的.但是注意的是如果你在一个线程中操纵另外的控件,这时候会提示你一个错误,这个错误的解决方法准备单独的在另一篇文章中来 ...
- linear model for classification
不同error function比较
- 无线端web开发学习总结
无线web开发之前要做一些准备工作:一.必需的reset样式库1.其中的重点是盒模型box-sizing:由原来pc端的content-box改为border-box. *, *:before, *: ...
- [Machine Learning] Probabilistic Graphical Models:一、Introduction and Overview(1、Overview and Motivation)
一.PGM用来做什么 1. 医学诊断:从各种病症分析病人得了什么病,该用什么手段治疗 2. 图像分割:从一张百万像素级的图片中分析每个像素点对应的是什么东西 两个共同点:(1)有非常多不同的输入变 ...
- Servlet&JSP基础
Servlet JSP JSP四种基本语法: JSP注释<%--注释内容--> JSP声明<%!变量.函数%> JSP表达式<%= ...
- php Imagick库readImage()报Postscript delegate failed 解决方法(失效)
需要安装 ghostscript http://www.ghostscript.com/download/gsdnld.html
- word2007在试图打开文件时遇到错误解决方法
当您尝试在 Microsoft Office Word 2007 中打开 .docx 文件时,该文件打不开.此外,您还会收到以下错误消息: Word 在试图打开文件时遇到错误.请尝试下列方法:* 检查 ...
- 帝国cms7.0修改默认搜索模版中的分页[!--show.page--]
修改默认搜索模版的分页是在e/class/connect.php下 搜索下function page1就是我们要修改的分页了 下面贴上我修改后的分页 //前台分页 function page1($nu ...
- iOS: XCode6 beta 6 错误
在使用XCode6 Beta6时, 遇到"__TFSs15_arrayForceCastU___FGSaQ__GSaQ0__"错误: 在http://stackoverflow.c ...