HDU 5483 (最小生成树 + 求无向图割边)
2015-09-30 00:22
351 查看
题意:给定一个无向图,求必然出现在其MST上的边的数量。
考虑Kruskal求解MST的过程,显然只有在出现边权相等的情况下,得到的MST不唯一。
那么接下来就是确定在每一组边权相等的边集中,哪些边是必然会出现在MST上的。
我们按照边权从小到大的顺序枚举每一组边权相等的边,然后以每一个连通分量为节点重新建图,并将这些边添加进去。
然后我们的目标便是求得该图的任意一个生成树。显然一条边必然出现在生成树的充要条件是该边为该无向图的割边,所以只要求一遍割边即可。
考虑Kruskal求解MST的过程,显然只有在出现边权相等的情况下,得到的MST不唯一。
那么接下来就是确定在每一组边权相等的边集中,哪些边是必然会出现在MST上的。
我们按照边权从小到大的顺序枚举每一组边权相等的边,然后以每一个连通分量为节点重新建图,并将这些边添加进去。
然后我们的目标便是求得该图的任意一个生成树。显然一条边必然出现在生成树的充要条件是该边为该无向图的割边,所以只要求一遍割边即可。
#define N 3072 #define PII pair<int,int> #include <bits/stdc++.h> using namespace std; vector<int> g ; vector<PII> edge,v ; int T,n,x,cnt,res,p ,dfn ,low ; int find(int x) { return p[x]==x?p[x]:p[x]=find(p[x]); } void dfs(int u,int fa) { dfn[u]=low[u]=++cnt; for(int i=0;i<g[u].size();i++) { int id=g[u][i]; if(id!=fa) { int v=edge[id].first==u?edge[id].second:edge[id].first; if(!dfn[v]) { dfs(v,id),low[u]=min(low[u],low[v]); if(low[v]>dfn[u]) res++; } else low[u]=min(low[u],dfn[v]); } } } int main() { for(cin>>T;T--;) { cin>>n; for(int i=1;i<N;i++) v[i].clear(),p[i]=i; for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) scanf("%d",&x),v[x].push_back(PII(i,j)); res=0; for(int i=1;i<N;i++) { edge.clear(); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); for(int j=1;j<=n;j++) g[j].clear(); for(int j=0;j<v[i].size();j++) { int x=find(v[i][j].first),y=find(v[i][j].second); if(x!=y) edge.push_back(PII(x,y)),g[x].push_back(edge.size()-1),g[y].push_back(edge.size()-1); } for(int j=1;j<=n;j++) if(!dfn[j]) cnt=0,dfs(j,-1); for(int j=0;j<v[i].size();j++) { int x=find(v[i][j].first),y=find(v[i][j].second); if(x!=y) p[x]=y; } } cout<<res<<endl; } return 0; }
相关文章推荐
- oracle-数据泵备份还原
- 【个人博客作业II】代码复审结果
- 速度之王 — LZ4压缩算法(三)
- Android学习路线图
- 2.9-mysql主从配置-3
- 安装SparkR
- lz4,pigz,gzip 3者比较
- linux之压缩解压缩及归档工具
- Android适配器进阶之三(抽象分类适配器)
- Enable Nux Dextop Repository on CentOS
- 简单的数字顺序表游戏
- java面试题三十一
- 2.8-mysql主从配置-2
- 阿里的Pay Watch到底是只什么表?
- spring笔记 Bean实例化的机制
- 软件测试 读书笔记(思维导图)
- DeCAF: A Deep Convolutional Activation Featurefor Generic Visual Recognition阅读报告(2)
- Z-stack 2.6.1中新增的ZIGBEE_CHILD_AGING模式怎么使用?
- MFC 画标尺
- GitHub使用基础