UVa #1395 Slim Span (例题11-2)
来源:互联网 发布:大数据 普惠金融 论文 编辑:程序博客网 时间:2024/05/17 23:20
这道题的目标是最大权值和最小权值的差最小,和最小生成树不太一样。
我们可以暴力枚举最小权值(放弃权值更小的边),然后求最小生成树。因为Kruscal算法按照权值顺序考虑各条边,所以一旦所有点连通,则可以计算出最大权值和最小权值的差并记录,然后continue。
Run Time: 0.079s
#define UVa "LT11-2.1395.cpp"//Slim Spanchar fileIn[30] = UVa, fileOut[30] = UVa;#include<cstring>#include<cstdio>#include<algorithm>#include<vector>#include<iostream>using namespace std;//Global Variables. Reset upon Each Case!const int maxn = 100+5, maxm = maxn*maxn;int n, m, u[maxm], v[maxm], w[maxm], r[maxm];int fa[maxn]; //union-find set./////int cmp(int a, int b) { return w[a] < w[b]; }int find(int s) { int t = s; while(s != fa[s]) s = fa[s]; while(fa[t] != s) { //re-assign parent along the path int tmp = fa[t]; fa[t] = s; t = tmp; } return s;}int solve() { int ans = -1; for(int L = 0; L < m; L ++) { for(int i = 1; i <= n; i ++) fa[i] = i; for(int R = L; R < m; R ++) { if(ans != -1 && ans <= w[r[R]] - w[r[L]]) break; //pruning int e = r[R]; int x = find(u[e]), y = find(v[e]); if(x != y) { //not in same connceted block, add it to connected block. fa[x] = y; for(int i = 2; i <= n; i ++) //check connected blocks if(find(i) != find(i-1)) goto EXIT; if(ans == -1) ans = w[r[R]] - w[r[L]]; else ans = min(ans, w[r[R]] - w[r[L]]); break; EXIT: continue; } } } return ans;}int main() { while(scanf("%d%d", &n, &m) && n) { for(int i = 0; i < m; i ++) { scanf("%d%d%d", &u[i], &v[i], &w[i]); r[i] = i; } sort(r, r+m, cmp); cout<<solve()<<endl; } return 0;}
0 0
- UVa #1395 Slim Span (例题11-2)
- 例题11-2 UVA - 1395 Slim Span 苗条的生成树(Kruscal最小生成树)
- UVA 1395 Slim Span
- 【UVA】1395-Slim Span
- UVA 1395 - Slim Span
- UVA - 1395 Slim Span
- UVa 1395 Slim Span
- UVA 1395 Slim Span
- UVa 1395 slim span
- UVA 1395 Slim Span
- UVA 1395 Slim Span
- UVA 1395Slim Span
- uva 1395Slim Span
- uva 1395 Slim Span
- Uva 1395 Slim Span
- UVA 1395 Slim Span(枚举)
- uva 1395 slim span MST
- 经典第十一章 例题11-2 UVA 11395 Slim Span(最小生成树)【ACM/ICPC Japan2007】
- tomcat部署war,启动访问不到工程,需要启动两次(<Context path=""..../>)
- 第一次写博客
- 为NGSOS智能操作系统设计编程语言
- git之github笔记
- 对于学习Android系统移植方法的探讨(一)----linux内核移植
- UVa #1395 Slim Span (例题11-2)
- android屏幕分辨率 的获取
- Makefile include
- 记录一些平时用的工具用法及命令(1)
- web.xml组件加载顺序
- 欢迎使用CSDN-markdown编辑器
- Java 的三种循环:foreach,Iterator 和 classic for loop
- ROS开发环境之Qt Creator
- Android获取屏幕当前状态