UVA796:利用Tarjan求无向图的割边(桥)
Tarjan求割边和求割点的差异不大
int n,deep,root,cnt;
int g[maxn],dfn[maxn],low[maxn];
struct Edge{int t,w,next;}e[maxm];
map<int,map<int,int> > mp;
vectorint,int> > bridge;
这里有的变量在上一篇博文中已经介绍过了
我们看到mp映射是用来替代二维数组进行判重的
本来打算换成hash_map但是发现并不好用,这是个必须要补的坑
这里的判重是判断是否有重边,由于权重都是1所以并不需要进行更新边权
由于是使用的邻接表来存的图,所以判重不是很方便
可以先读成邻接矩阵再转存邻接表
bridge就是我们求出来的所有的桥
int tarjan(int u,int fa)
{
int lowu;
lowu=dfn[u]=++deep;
for(int tmp=g[u];tmp;tmp=e[tmp].next)
{
int v=e[tmp].t;
if(!dfn[v])
{
int lowv=tarjan(v,u);
lowu=min(lowu,lowv);
if(lowv>dfn[u])
{
int from,to;from=u;to=v;
if(from>to) swap(from,to);
bridge.push_back(make_pair(from,to));
}
}
else if(v!=fa&&dfn[v]<dfn[u])
lowu=min(lowu,dfn[v]);
}
low[u]=lowu;
return lowu;
}
int tarjan(int u,int fa)
{
int lowu;
lowu=dfn[u]=++deep;
for(int tmp=g[u];tmp;tmp=e[tmp].next)
{
int v=e[tmp].t;
if(!dfn[v])
{
int lowv=tarjan(v,u);
lowu=min(lowu,lowv);
if(lowv>dfn[u])
{
int from,to;from=u;to=v;
if(from>to) swap(from,to);
bridge.push_back(make_pair(from,to));
}
}
else if(v!=fa&&dfn[v]<dfn[u])
lowu=min(lowu,dfn[v]);
}
low[u]=lowu;
return lowu;
}
int tarjan(int u,int fa)
{
int lowu;
lowu=dfn[u]=++deep;
for(int tmp=g[u];tmp;tmp=e[tmp].next)
{
int v=e[tmp].t;
if(!dfn[v])
{
int lowv=tarjan(v,u);
lowu=min(lowu,lowv);
if(lowv>dfn[u])
{
int from,to;from=u;to=v;
if(from>to) swap(from,to);
bridge.push_back(make_pair(from,to));
}
}
else if(v!=fa&&dfn[v]<dfn[u])
lowu=min(lowu,dfn[v]);
}
low[u]=lowu;
return lowu;
}
以上是求割边的Tarjan
最后给出完整实现,题目说了要排序,那就排序吧。把求出来的桥排序
1 #include
2 #include
3 #include
4 #include