图的割点简单问题代码模版:
输入n,m代表顶点个数和边数,下面m行是m条无向边
输出各个割点:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,index,root;
int v[100],u[100];
int first[15],next[100];
int time[15],low[15];
bool vis[15];
void dfs(int cur)
{
int child=0;
time[cur]=++index; //时间戳
low[cur]=index; //可追溯到先前时间戳
for(int t=first[cur];t!=-1;t=next[t])
{
if(!time[v[t]]){
child++;
dfs(v[t]);
low[cur]=min(low[cur],low[v[t]] );
if(cur!=root&&low[v[t] ]>=time[cur]){
vis[cur]=1;
}
if(cur==root&&child>1) vis[cur]=1; //当判断根是不是割点的时候要单独拿出来判断,当从根dfs有1个以上儿子的时候即使割点
}
else {
low[cur]=min(low[cur],time[v[t] ]);
}
}
}
int main()
{
memset(first,-1,sizeof(first));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&u[i],&v[i]);
next[i]=first[u[i] ];
first[u[i]] = i;
u[i+m]=v[i],v[i+m]=u[i];
next[i+m]=first[u[i+m] ];
first[u[i+m] ]=i+m;
}
root=1;
dfs(root);
for(int i=1;i<=n;i++)
if(vis[i]) printf("%d ",i);
puts("");
// for(int i=1;i<=n;i++) printf("time[%d]=%d ",i,time[i]);
// puts("");
// for(int i=1;i<=n;i++) printf("low[%d]=%d ",i,low[i]);
// puts("");
return 0;
}
图的割边简单问题代码模版
输入n,m代表顶点个数和边数,下面m行是m条无向边
输出各条割边:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,root,index;
int first[15],next[100];
int time[15],low[15];
int v[100],u[100];
void dfs(int fa,int cur) //这时必须有fa(父亲)这个参数,和图的割点不样了
{
time[cur]=++index; //时间戳
low[cur]=index; //可追溯到的时间戳
for(int t=first[cur];t!=-1;t=next[t]){
if(!time[v[t] ]){
dfs(cur,v[t]);
low[cur]=min(low[cur],low[v[t]]);
if(low[v[t]]>time[cur]) printf("%d--%d\n",cur,v[t]); //这也是和图的割点的区别之一。不要对cur==root的时候进行特判了。
}
else if(v[t]!=fa){
low[cur]=min(low[cur],time[v[t] ]);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
for(int i=1;i<=m;i++){
scanf("%d%d",&u[i],&v[i]);
next[i]=first[u[i] ];
first[u[i] ]= i;
u[i+m]=v[i];
v[i+m]=u[i];
next[i+m]=first[u[i+m] ];
first[u[i+m] ]=i+m;
}
root=1;
dfs(root,root);
// for(int i=1;i<=n;i++) printf("time[%d]=%d ",i,time[i]);
// puts("");
// for(int i=1;i<=n;i++) printf("low [%d]=%d ",i,low[i]);
// puts("");
return 0;
}