博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3522 Slim Span
阅读量:6533 次
发布时间:2019-06-24

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

POJ_3522

    这个题目我们可以枚举每条边作为生成树中权值最小的边,然后做最小生成树,不过我们这样去写,不知道会不会超时。

    也可以在做kruscal的时候,如果加上当前边会构成环,那么就将这个环上权值最小的边删掉。同时如果当前已经形成了最小生成树,就遍历一遍生成树,找到边权的最大值和最小值更新一下结果。

#include
#include
#include
#define MAXD 110#define MAXM 10010#define INF 0x3f3f3f3fusing namespace std;int N, M, first[MAXD], e, pre[MAXM], next[MAXM], u[MAXM], v[MAXM], w[MAXM], p[MAXD];struct Edge{ int u, v, w; bool operator < (const Edge &t) const { return w < t.w; }}edge[MAXM];int Find(int x){ return p[x] == x ? x : (p[x] = Find(p[x]));}void init(){ int i; for(i = 0; i < M; i ++) scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w); sort(edge, edge + M);}void add(int x, int y, int z){ u[e] = x, v[e] = y, w[e] = z; if(first[x] != -1) pre[first[x]] = e; pre[e] = -1; next[e] = first[x], first[x] = e ++;}void Delete(int k){ if(pre[k] == -1) first[u[k]] = next[k]; else next[pre[k]] = next[k]; if(next[k] != -1) pre[next[k]] = pre[k];}void dfs(int cur, int fa, int to, int m, int k){ if(cur == to) { Delete(k), Delete(k ^ 1); return ; } int i; for(i = first[cur]; i != -1; i = next[i]) if(v[i] != fa) { if(w[i] < m) dfs(v[i], cur, to, w[i], i); else dfs(v[i], cur, to, m, k); }}void Search(int cur, int fa, int &min, int &max){ int i; for(i = first[cur]; i != -1; i = next[i]) { if(v[i] != fa) { if(w[i] < min) min = w[i]; if(w[i] > max) max = w[i]; Search(v[i], cur, min, max); } }}void solve(){ int i, j, k, tx, ty, cnt = 0, ans = INF, min, max; for(i = 1; i <= N; i ++) p[i] = i; memset(first, -1, sizeof(first)); e = 0; for(i = 0; i < M; i ++) { tx = Find(edge[i].u), ty = Find(edge[i].v); if(tx != ty) ++ cnt, p[ty] = tx; else dfs(edge[i].u, -1, edge[i].v, INF, 0); add(edge[i].u, edge[i].v, edge[i].w), add(edge[i].v, edge[i].u, edge[i].w); if(cnt == N - 1) { min = INF, max = 0; Search(1, -1, min, max); if(max - min < ans) ans = max - min; } } if(cnt != N - 1) printf("-1\n"); else printf("%d\n", ans);}int main(){ for(;;) { scanf("%d%d", &N, &M); if(!N && !M) break; init(); solve(); } return 0;}

转载地址:http://csqbo.baihongyu.com/

你可能感兴趣的文章
iOS获取APP ipa 包以及资源文件
查看>>
CentOS 7 关闭启动防火墙
查看>>
Vue-选项卡切换
查看>>
linux网络命令
查看>>
poj3984 迷宫问题(简单搜索+记录路径)
查看>>
Linux 服务器buff/cache清理
查看>>
算法试题 及其他知识点
查看>>
php课程---Json格式规范需要注意的小细节
查看>>
hadoop hdfs notes
查看>>
Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
查看>>
(2编写网络)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
查看>>
【转】如何使用分区助手完美迁移系统到SSD固态硬盘?
查看>>
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
查看>>
ios兼容iphonex刘海屏解决方案
查看>>
就是要你懂TCP -- 握手和挥手
查看>>
Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection
查看>>
《Python游戏编程快速上手》一1.3 如何使用本书
查看>>
《Visual Studio程序员箴言》----1.2 滚动与导航
查看>>
Processing编程学习指南2.7 Processing参考文档
查看>>
架构师速成-架构目标之伸缩性\安全性
查看>>