图的绝对中心(bzoj 2180: 最小直径生成树)
来源:互联网 发布:linux安装telnet服务 编辑:程序博客网 时间:2024/05/21 06:11
2180: 最小直径生成树
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 219 Solved: 105
[Submit][Status][Discuss]
Description
输入一个无向图G=(V,E),W(a,b)表示边(a,b)之间的长度,求一棵生成树T,使得T的直径最小。树的直径即树的最长链,即树上距离最远的两点之间路径长度。
Input
输入第一行包括两个整数N,M,分别表示点与边的个数。 以下M行,每行3个整数X,Y,Z,描述一条无向边(X,Y),且W(X,Y)=Z。
Output
仅一个数,即最小直径。
Sample Input
3 3
1 2 0
2 3 1
3 1 2
Sample Output
1
图的绝对中心:可以存在于任何一条边上,该点到所有点的最短距离的最大值最小
那么最小直径生成树的直径一定是这个最大值*2
网上貌似没有详细讲最小直径生成树证明的,以前有一篇不过404了,只能暂时存下模板
road[i][j]:i点到j点的最短路
a[i][j]:i点到j点边的长度(当然没有边就INF)
rk[i][j]:i点到其它所有点最短路中第k小的是点i到点rk[i][j]
大致步骤:
①初始化road[i][i]=0,floyd求出任意两点的最短路
②每个点暴力排序它到其他所有点的最短路,求出所有的rk[i][j]
③图的绝对中心可能在点上:初始化ans = min(每个点到相对它最远的那个点的距离*2)
④图的绝对中心可能在边上:暴力每条边E(u, v),从离u点最远的点开始验证
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define INF 1044266558int road[305][305], a[305][305], rk[305][305];int main(void){int n, m, i, j, k, x, y, ans, now;scanf("%d%d", &n, &m);memset(road, 62, sizeof(road));memset(a, 62, sizeof(a));for(i=1;i<=n;i++)road[i][i] = 0;for(i=1;i<=m;i++){scanf("%d%d%d", &x, &y, &k);if(road[x][y]<k)continue;a[x][y] = a[y][x] = k;road[x][y] = road[y][x] = k;}for(k=1;k<=n;k++){for(i=1;i<=n;i++){for(j=1;j<=n;j++)road[i][j] = min(road[i][j], road[i][k]+road[k][j]);}}for(i=1;i<=n;i++){for(j=1;j<=n;j++)rk[i][j] = j;for(j=1;j<=n;j++){for(k=j+1;k<=n;k++){if(road[i][rk[i][k]]<road[i][rk[i][j]])swap(rk[i][k], rk[i][j]);}}}ans = INF;for(i=1;i<=n;i++)ans = min(ans, road[i][rk[i][j]]);for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(road[i][j]==0 || a[i][j]==INF)continue;now = n;for(k=n-1;k>=2;k--){if(road[i][rk[j][k]]>road[i][rk[j][now]]){ans = min(ans, road[j][rk[j][k]]+road[i][rk[j][now]]+a[i][j]);now = k;//now:保证road[i][rk[j][now]]是后缀最大的}}}}printf("%d\n", ans);return 0;}
阅读全文
0 0
- 图的绝对中心(bzoj 2180: 最小直径生成树)
- 求图的绝对中心 && 最小直径生成树 MDST
- 求图的绝对中心 && 最小直径生成树 MDST
- 【bzoj2180】【最小直径生成树】【图的绝对中心】
- [BZOJ 2180]最小直径生成树
- [最小直径生成树 模板题] BZOJ 2180 最小直径生成树 & BZOJ 2182 [Spoj1479] TGK & Ural 1569 Networking the “Iset”
- bzoj2180: 最小直径生成树
- 求树的直径和中心(ZOJ3820)
- 树的直径与树的中心
- 树的直径与树的中心
- 树的直径与树的中心
- bzoj 1083: [SCOI2005]繁忙的都市 (最小生成树)
- BZOJ 2429 聪明的猴子 (最小生成树 kruskal)
- bzoj 2429: [HAOI2006]聪明的猴子(最小生成树)
- *【bzoj 1601】灌水(最小生成树)
- HPU图论专项(graph)【拓扑--二分图--最小生成树---树的直径---并查集--奇偶树---最小环---强联通】
- bzoj 2282: [Sdoi2011]消防(树的直径+二分)
- BZOJ 2561: 最小生成树(最小割)
- Java:super和this的不同
- JNI 之 文件的拆分和合并
- 菜鸟前端日记6 (原生JS--函数基础)
- STM32学习之:定时器简介
- 惊呆!谷歌AI自动编程效率超研发工程师,作为AI工程师的我感到了森森的压力
- 图的绝对中心(bzoj 2180: 最小直径生成树)
- JSON字符串和对象之间的相互转换
- XML文件格式
- 3、JQuery——DOM的插入
- 论文理解 Deep Residual Learning for Image Recognition
- Resin4和Tomcat8容器下部署Maven项目
- readonly 和 disable 的区别
- 关于ASP.NET和.NET的区别和联系 对于一个新手,往往会被这些名字给搞蒙了,对不起(笨小孩我也被搞蒙过,见笑啦),这归根结底还是怪自己对知识掌握和了解的不够,废话不多,直接到主题。 ASP.N
- Linux lvm cache的应用