【HDU 4738 Caocao's Bridges】BCC 找桥

简介: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:给定一个n个节点m条边的无向图(可能不连通、有重边),每条边有一个权值。判断其连通性,若双连通,输出-1;若非连通,输出0;否则,输出权值最小的桥的权值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738

题意:给定一个n个节点m条边的无向图(可能不连通、有重边),每条边有一个权值。判断其连通性,若双连通,输出-1;若非连通,输出0;否则,输出权值最小的桥的权值。

思路:进行双连通域分解,记下连通块的个数和所有桥的情况,对应输出结果即可。

注意对重边的处理。这里我按照上一道题学到的姿势如法炮制:先把所有边按“字典序”排序(u, v, w),这样重边聚集在一起了,然后扫描一遍,发现重边即在结构体Edge中打重边标记;由于重边一定不是桥,因此选哪个的权值实际上无所谓。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <vector>
  5 #define CLEAR(A, X) memset(A, X, sizeof(A))
  6 #define REP(N) for(int i=0; i<(N); i++)
  7 #define REPE(N) for(int i=1; i<=(N); i++)
  8 #define FREAD(FN) freopen((FN), "r", stdin)
  9 #define pb(a) push_back(a)
 10 
 11 using namespace std;
 12 
 13 const int MAX_N = 1005;
 14 const int MAX_M = 2000005;
 15 const int INF = 10005;
 16 int n, m;
 17 
 18 struct Edge
 19 {
 20     int v, next;
 21     int w;
 22     bool isBrg;
 23     bool isDup;
 24 }edges[MAX_M];
 25 int numE;
 26 int head[MAX_N];
 27 int low[MAX_N], dfn[MAX_N], clock;
 28 int inStack[MAX_N], S[MAX_N], topS;
 29 int block, belong[MAX_N];
 30 int numBrg;
 31 int cnt;//连通块个数
 32 
 33 void init(){
 34     numE = 0;
 35     clock = block = topS = 0;
 36     numBrg = 0;
 37     CLEAR(low, 0);
 38     CLEAR(dfn, 0);
 39     CLEAR(head, -1);
 40     CLEAR(belong, 0);
 41     CLEAR(inStack, 0);
 42 }
 43 
 44 
 45 void addEdge(int u, int v, int w, bool isDup){
 46     edges[numE].v = v;
 47     edges[numE].w = w;
 48     edges[numE].isBrg = 0;
 49     edges[numE].isDup = isDup;
 50     edges[numE].next = head[u];
 51     head[u] = numE++;
 52 
 53     //反向边
 54     edges[numE].v = u;
 55     edges[numE].w = w;
 56     edges[numE].isBrg = 0; //这里之前忘清零了,一直WA。。。
 57     edges[numE].isDup = isDup;
 58     edges[numE].next = head[v];
 59     head[v] = numE++;
 60 }
 61 
 62 void bcc(int u, int p, int isDup){
 63     low[u] = dfn[u] = ++clock;
 64     S[topS++] = u;
 65     inStack[u] = 1;
 66     for(int i=head[u]; i != -1; i = edges[i].next){
 67         int v = edges[i].v;
 68         if(v == p && (!isDup)) continue;
 69         if(!dfn[v]){
 70             bcc(v, u, edges[i].isDup);
 71             low[u] = min(low[u], low[v]);
 72             if(low[v] > dfn[u]){//bridge
 73                 numBrg++;
 74                 edges[i].isBrg = 1;
 75                 edges[i^1].isBrg = 1;
 76             }
 77         }else if(inStack[v]){//backward
 78             low[u] = min(low[u], dfn[v]);
 79         }
 80     }
 81     if(low[u] == dfn[u]){//new bcc
 82         block++;
 83         int t;
 84         do{
 85             t = S[--topS];
 86             inStack[t] = 0;
 87             belong[t] = block;
 88         }while(t != u);
 89     }
 90 }
 91 
 92 struct Node
 93 {
 94     int u, v, w;
 95     Node(){}
 96     Node(int uu, int vv, int ww):u(uu), v(vv), w(ww){}
 97 }nodes[MAX_M];
 98 bool cmp(Node a, Node b){
 99     if(a.u == b.u){
100         if(a.v == b.v) return a.w < b.w;
101         return a.v < b.v;
102     }
103     return a.u < b.u;
104 }
105 bool same(Node a, Node b){
106     return a.u == b.u && a.v == b.v;
107 }
108 
109 int main()
110 {
111     FREAD("4738.txt");
112     while(~scanf("%d%d", &n, &m) && !(n==0 && m==0)){
113         init();
114         REP(m){
115             int u, v, w;
116             scanf("%d%d%d", &u, &v, &w);
117             if(u > v) swap(u, v);//保持顺序
118             nodes[i] = Node(u, v, w);
119         }
120         sort(nodes, nodes+m, cmp);
121         int cur = 0, i = 1;
122         int flagDup = 0;
123         while(cur < m){
124             while(i < m && same(nodes[cur], nodes[i])){
125                 flagDup = 1;
126                 i++;
127             }//重边一定不是桥,
128             if(flagDup) addEdge(nodes[cur].u, nodes[cur].v, nodes[cur].w, true);
129             else addEdge(nodes[cur].u, nodes[cur].v, nodes[cur].w, false);
130             flagDup = 0;
131             cur = i++;
132         }
133         cnt = 0;
134         REPE(n){
135             if(!dfn[i]){
136                 bcc(i, 0, 0);
137                 cnt++;
138             }
139         }
140         int ans = INF;
141         if(cnt > 1) ans = 0;//非连通
142         else if(cnt==1 && !numBrg) ans = -1;//边双连通
143         else{//有桥
144             // REPE(n){
145             //     for(int j=head[i]; j != -1; j = edges[j].next){
146             //         int v = edges[j].v;
147             //         if(belong[i] != belong[v])
148             //             ans = min(ans, edges[j].w);
149             //     }
150             // }
151             REPE(numE){
152                 if(edges[i].isBrg)
153                     ans = min(ans, edges[i].w);
154             }
155             if(ans == 0) ans = 1;//至少派一人
156         }
157         printf("%d\n", ans);
158     }
159     return 0;
160 }

判桥用 edges[i].isBrg 或 belong[u] == belong[v]都可以,二者等价。

多组样例,我开始用第一种但忘记在addEdge中把isBrg清零了才会WA。

目录
相关文章
|
Kubernetes 应用服务中间件 API
Kubernetes(K8S)命令指南
Kubernetes(K8S)命令指南
458 0
|
7月前
|
移动开发 JavaScript API
HarmonyOS Next 简单上手元服务开发
本文介绍了 HarmonyOS Next 中元服务的开发流程与关键特性。元服务是一种轻量级应用程序形态,支持免安装、秒开直达,适用于听音乐、打车等场景,大幅提升服务获取效率。文章详细讲解了元服务的开发旅程,包括在 AGC 平台上新建项目、修改名称与图标、新增卡片等内容,并提供了代码示例,如 AtomicServiceTabs 的 tab 切换和标题设置、AtomicServiceNavigation 的路由管理等。此外,还探讨了 AtomicServiceWeb 的使用方法,涵盖鸿蒙页面与 h5 页面的数据传递及方法调用。
399 20
HarmonyOS Next 简单上手元服务开发
|
弹性计算 固态存储 大数据
阿里云服务器多少钱一年?2024年阿里云服务器价格表曝光!
2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年82元,折合6.8元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器298元一年,2核4G服务器30元3个月,4核16G10M服务器26元1个月、149元半年,8核32G服务器90元1个月、271元3个月,阿小云整理阿里云服务器租用费用价格表,包括一年优惠价格、一个月和1小时收费明细表
1119 3
|
API Python
python中copy模块的使用,深拷贝和浅拷贝
python中copy模块的使用,深拷贝和浅拷贝
275 0
|
12月前
|
机器学习/深度学习 数据采集 人工智能
AI与机器学习:从理论到实践
【10月更文挑战第2天】本文将深入探讨AI和机器学习的基本概念,以及它们如何从理论转化为实际的应用。我们将通过Python代码示例,展示如何使用机器学习库scikit-learn进行数据预处理、模型训练和预测。无论你是AI领域的初学者,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。
|
9月前
|
人工智能 自然语言处理 Cloud Native
智保未来:国泰产险的 AI 网关革新之旅
国泰产险在数智化转型中,全面拥抱大模型技术,通过阿里云云原生API网关简化接入复杂性,提升数据安全性和成本管控能力。公司在外呼、客服、内容生成等业务场景深度应用大模型,解决了多模型统一接入、认证鉴权、内容安全、成本管控和审计风控五大挑战,成为保险行业数智化转型的典范。
269 15
|
9月前
|
存储 数据处理 对象存储
云端问道方案教学4期—多媒体数据存储与分发
本文整理自阿里云存储服务产品团队关于多媒体数据存储与分发的分享,涵盖以下四部分内容:1)行业痛点及背景:分析Web 2.0到AIGC时代下多媒体行业的存储挑战;2)方案优势介绍:结合对象存储(OSS)、智能媒体管理(IMM)和内容分发网络(CDN),提供高效、低成本的解决方案;3)典型场景应用:包括音视频、在线教育、网站/APP/小程序、游戏下载等场景的具体应用;4)选型推荐:根据业务需求选择合适的产品配置。该方案通过动静分离、智能处理和全球加速,帮助企业在数据存储与分发中实现降本增效。
189 2
|
运维 监控 Cloud Native
茶百道全链路可观测实战
茶百道全链路可观测实战
2046 118
单片机IO口模拟串口实现原理
单片机IO口模拟串口实现原理
526 5
|
存储 Java 测试技术
滚雪球学Java(30):多维数组:定义和初始化一次搞定
【5月更文挑战第5天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
251 0
滚雪球学Java(30):多维数组:定义和初始化一次搞定