博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF400D最短路
阅读量:5156 次
发布时间:2019-06-13

本文共 1540 字,大约阅读时间需要 5 分钟。

题意:给你n个点,是否可以分成k块,如果可以分,就求任意两块之间的最短路。如果两点距离为0即为一块,但是还有一个条件,我一开始没看清,

以为只要是可以满足K块就行,与先后顺序无关,其实不然。如果是分成3块,第一块是5,第二块是3,第三块是4,那么1到5号点都是第一块的,

6到8号点时第二块的,9到11号点是第三块的,如果不满足这种就是错误的。有点坑啊,英语是硬伤啊!!!!!

思路:先用并查集如果满足w=0;那么就是一个集合,再按顺序求出那些点应该是在那个块。再求块到块之间如果有路径,就保存最短的那条,

判断是不是都满足分块的要求,如果满足,就跑一次Floyd,求得任意两块之间的距离。

#include 
#include
#include
using namespace std;const int maxm = 100009;const int maxn = 600;const int inf = 1<<29;struct node{ int u,v,w;}eg[maxm];int fa[maxm];int dis[maxn][maxn];int Count[maxn]; int hash[maxn];int sum[maxn];int n,m,k;int pre[maxm];void init(){ int i,j; for(i=0; i<= n; i++) fa[i] = -1; for(i =0;i
= 0;p = fa[p]); while(x != p) { int temp = fa[x]; fa[x] = p; x = temp; } return p;}void Union(int a,int b){ int x = find(a); int y = find(b); if(x == y) return ; int temp = fa[x] + fa[y]; if(fa[x] > fa[y]) fa[x] = y, fa[y] = temp; else fa[y] = x, fa[x] = temp;}void floyd(){ for(int z =0; z < k; z++) { for(int i= 0; i < k; i++) { for(int j = 0;j < k; j++) { if(dis[i][j] > dis[i][z] + dis[z][j]) dis[i][j] = dis[i][z] + dis[z][j]; } } }}inline int min(int a,int b){return a < b ? a : b;}int main(){ int i; while(~scanf("%d%d%d",&n,&m,&k)) { init(); sum[0] = 0; for(i=1;i<=k;i++) { scanf("%d",&Count[i]); sum[i] =sum[i-1] + Count[i]; } for(i=0;i
= inf)dis[i][j] = -1; printf("%d ",dis[i][j]); } printf("\n"); } } return 0;}

 

转载于:https://www.cnblogs.com/BruceNoOne/p/3900542.html

你可能感兴趣的文章
如何获取repeater某行第一列的值
查看>>
利用"SQL"语句自动生成序号的两种方式
查看>>
discuz完善用户资料任务不能完成的解决方法
查看>>
结对编程之实战
查看>>
linux内核调度算法(2)--CPU时间片如何分配
查看>>
微软银光 Sliverlight
查看>>
java学习日记(9)———socket,网络编程的学习
查看>>
BLE4.0教程四 新增特征值(CC2541)
查看>>
TTButton 的正确使用的方法
查看>>
SQL Server数据库漏洞评估了解一下
查看>>
gdb打印STL和boost容器
查看>>
HDU4790
查看>>
MySQL安装相关
查看>>
其他——[转]从实现iPhone的OAuth封装看国内互联网和开放平台
查看>>
[LeetCode] Remove Element 分析
查看>>
编译安装httpd-2.4.12
查看>>
Worker Thread
查看>>
vuejs解析url地址
查看>>
nodejs服务器部署教程一
查看>>
MyEclipse 2017 CI 10 发布(附下载)
查看>>