[HDU1598]find the most comfortable road

本文介绍了一种使用并查集进行优化的最短路径算法实现思路,通过枚举最小与最大边权来判断两点间是否存在路径,并利用并查集进行节点连接状态的维护,实现了高效的动态加边操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

考虑一个暴力:枚举最大的边权和最小的边权,然后将边权在这之间的边全拿出来构成一张无向图,剩下的就是判断是否存在一条从$S$到$T$的路径。
相当于判$S$和$T$是否连通,用并查集连一下即可。
时间复杂度:O(m³α(n))
考虑优化,枚举了最小边权之后,从小到大枚举最大边权,每次能新添加一条边。
因为并查集是支持动态加边的,所以复杂度就降到O(m²α(n))了。
一开始存边的vector忘记每次清零,一直Wrong Answer。

 1 #include<cstdio>
 2 #include<vector>
 3 #include<algorithm>
 4 const int inf=0x7fffffff;
 5 struct Edge {
 6     int from,to,w;
 7     bool operator < (const Edge &x) const {
 8         return w<x.w;
 9     }
10 };
11 std::vector<Edge> e;
12 inline void add_edge(const int u,const int v,const int w) {
13     e.push_back((Edge){u,v,w});
14 }
15 const int N=201;
16 class DisjointSet {
17     private:
18         int anc[N];
19         int Find(const int x) {
20             return x==anc[x]?x:anc[x]=Find(anc[x]);
21         }
22     public:
23         void reset(const int n) {
24             for(int i=1;i<=n;i++) anc[i]=i;
25         }
26         bool isConnected(const int x,const int y) {
27             return Find(x)==Find(y);
28         }
29         void Union(const int x,const int y) {
30             anc[Find(x)]=Find(y);
31         }
32 };
33 DisjointSet s;
34 int main() {
35     int n,m;
36     while(~scanf("%d%d",&n,&m)) {
37         e.clear();
38         while(m--) {
39             int s,t,w;
40             scanf("%d%d%d",&s,&t,&w);
41             add_edge(s,t,w);
42         }
43         std::sort(e.begin(),e.end());
44         int q;
45         scanf("%d",&q);
46         while(q--) {
47             int S,T;
48             scanf("%d%d",&S,&T);
49             int ans=inf;
50             for(unsigned i=0;i<e.size();i++) {
51                 s.reset(n);
52                 for(unsigned j=i;j<e.size();j++) {
53                     int &u=e[j].from,&v=e[j].to;
54                     if(!s.isConnected(u,v)) {
55                         s.Union(u,v);
56                         if(s.isConnected(S,T)) {
57                             ans=std::min(ans,e[j].w-e[i].w);
58                             break;
59                         }
60                     }
61                 }
62             }
63             printf("%d\n",ans!=inf?ans:-1);
64         }
65     }
66     return 0;
67 }

 

转载于:https://www.cnblogs.com/skylee03/p/7301831.html

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值