做了一些连通图的专题,发现在题目中的特殊情况下需要判断当前连通图是一个还是多个,而既然提出了这个问题,就说明在有的问题中需要考虑这种情况。
拿HDU4738为例,这道题中,如果是给定边组成了一个连通图的话输出为-1,反之再进行其他的判断。
因为是需要求桥,所以在直接使用Tarjan算法了。
使用Tarjan算法的时候会有这样一个思考,题中有没有说给定的边构成一个图,如果是的话,你有没有直接写成Tarjan(1,0)这样的调用?如果不是的话就要加一个for循环了,但是加这个for循环的时候需要进行一个特判:
for(int i=1;i<=N;++i)
if(!DFN[i])
{
Tarjan(i,i);
++num;
}
当然,还可以使用并查集的方法,判断输入的两个点是否属于不同的集合,如果属于不同的集合就把他们合并起来,进行操作的地方是加边的时候:
for(int i=1; i<=m; ++i)
{
scanf("%d%d%d",&u,&v,&w);
if(u==v) continue;
addedge(u,v,w);
addedge(v,u,w);
bing(u,v)
}
因为是判断是否有多个连通图,只要存在两个或者两个以上就代表存在多个,所以我们找到并查集关系之后,只需要从1到n进行遍历当前的值是否与1不属于同一个连通图,如果是的话就代表存在多个连通图。
for(int i=1;i<=n;++i)
{
if(find(i)!=find(1))
{
flag=true;
}
}