hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)

简介: 1 /* 2 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! 3 4 tm太坑了... 5 1,如果这个无向图开始就是一个非连通图,直接输出0 6 2,重边(两个节点存在多条边, 权值不一样) 7 3,...
 1 /*
 2     题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同!
 3     
 4     tm太坑了...
 5     1,如果这个无向图开始就是一个非连通图,直接输出0
 6     2,重边(两个节点存在多条边, 权值不一样)
 7     3,如果找到了桥的最小权值为0,也就是桥上的士兵数为0,那么还是要最少派一个
 8     士兵过去炸掉桥! 
 9     
10     思路:假设每两个节点最多只有一条边进行相连!
11     进行tarjan算法,如果该算法调用了超过2次,说明这个原图就是不连通的!
12     否则在tarjan算法中将桥存起来!然后我们遍历每一座桥,看一看我们找到的
13     桥(连接的两个定点分别是u, v)是不是(u, v)只有一条路相连接,如果是的,
14     那么就跟新最小值! 
15 */
16 #include<iostream>
17 #include<cstdio>
18 #include<cstring>
19 #include<algorithm>
20 #define M 1000005
21 #define INF 0x3f3f3f3f
22 #define N 1005
23 using namespace std;
24 struct EDGE{
25    int u, v, w, nt; 
26    EDGE(){}
27    EDGE(int u, int v, int w, int nt){
28        this->u=u;
29        this->v=v;
30        this->w=w;
31        this->nt=nt;         
32    }
33 };
34 
35 EDGE edge[M];
36 EDGE brige[M];
37 int first[N];
38 int low[N], pre[N];
39 int dfs_clock;
40 int n, m, cnt, ret;
41 
42 
43 void tarjan(int u, int fa){
44     low[u]=pre[u]=++dfs_clock;
45     for(int e=first[u]; e!=-1; e=edge[e].nt){
46          int v=edge[e].v;
47         
48          if(!pre[v]){
49               tarjan(v, u);
50               low[u]=min(low[u], low[v]);
51               if(low[v]>pre[u])
52                  brige[ret++]=edge[e];
53          }         
54          else if(v!=fa && pre[u]>pre[v])
55               low[u]=min(low[u], pre[v]);
56     }        
57 }
58 
59 int main(){
60     while(scanf("%d%d", &n, &m) && (n||m)){
61         memset(first, -1, sizeof(first));
62         cnt=0;
63         while(m--){
64             int u, v, w;
65             scanf("%d%d%d", &u, &v, &w);
66             edge[cnt]=EDGE(u, v, w, first[u]);
67             first[u]=cnt++;
68             edge[cnt]=EDGE(v, u, w, first[v]);
69             first[v]=cnt++;
70         }      
71         dfs_clock=0;
72         ret=0;
73         memset(low, 0, sizeof(low));
74         memset(pre, 0, sizeof(pre)); 
75         int flag=0;
76         for(int i=1; i<=n; ++i)
77            if(!pre[i]){
78               ++flag;
79               if(flag==2) break;
80               tarjan(i, -1);
81            }
82         
83         int minNum=INF;
84         if(flag==2) minNum=0;
85         else{
86            for(int i=0; i<ret; ++i)
87              if(brige[i].w<minNum){//对假定的桥判断 
88                 int cc=0;
89                 for(int e=first[brige[i].u]; e!=-1; e=edge[e].nt)
90                    if(edge[e].v==brige[i].v) ++cc;
91                 if(cc==1)  minNum=brige[i].w;//说明是真正的桥 
92              }
93            if(minNum==INF) minNum=-1;
94            else if(minNum==0) minNum=1;//这一句不要忘记了! 
95         }
96         printf("%d\n", minNum);
97     } 
98     return 0;    
99 }

 

目录
相关文章
|
1天前
|
人工智能 运维 安全
|
4天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
377 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
6天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
616 107
|
3天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
198 127
|
3天前
|
Web App开发 前端开发 API
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
224 124
|
3天前
|
人工智能 数据可视化 测试技术
Coze平台指南(3):核心功能-创建智能体与设计角色
Coze 智能体是由大语言模型驱动,通过提示词设定角色,并借助知识库、插件和工作流扩展能力,以执行特定任务的AI助手。对测试工程师而言,精心设计的智能体可显著提升测试效率与质量,关键是要准确理解测试需求,并将其转化为智能体的角色设定和功能配置。建议进一步学习知识库与工作流,以深化应用。
|
7天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;