题意:就要给你一个图,求有多少个割点
思路:求无向图的割点,直接上模板没什么好说的,附上两种形式的模板
模板1:
//256K
63MS
#include <iostream>
#include <string.h>
#include <stdio.h>
#define M 110
using namespace std;
int dep[M],low[M],head[M];
bool cut[M];
int e,n,rt,son;
struct E
{
int to,nxt;
}edge[M*M];
void addedge (int cu,int cv)
{
edge[e].to = cv;
edge[e].nxt = head[cu];
head[cu] = e ++;
}
int min (int a,int b)
{
return a > b ? b : a;
}
void dfs (int cnt,int u)
{
dep[u] = low[u] = cnt;
for (int i = head[u];i != -1;i = edge[i].nxt)
{
int v = edge[i].to;
if (!dep[v])
{
dfs (cnt + 1,v);
if (u == rt)
son ++;
else
{
low[u] = min (low[u],low[v]);
if (dep[u] <= low[v])
cut[u] = true;
}
}
else
low[u] = min (low[u],dep[v]);
}
}
int main ()
{
int u,v;
while (cin >> n&&n)
{
memset (dep,0,sizeof(dep));
memset (low,0,sizeof(low));
memset (cut,false,sizeof(cut));
memset (head,0xFF,sizeof (head));
e = 0;
while (cin >> u&&u)
while (getchar()!= '\n')
{
cin >> v;
addedge (u,v);
addedge (v,u);
}
rt = 1;son = 0;
dfs (1,rt);
int ans = 0;
if (son > 1)
ans ++;
for (int i = 1;i <= n;i ++)
if (cut[i])
ans ++;
cout <<ans<<endl;
}
return 0;
}
模板2:
//256K
47MS
#include <iostream>
#include <string.h>
#include <stdio.h>
#define M 110
using namespace std;
int dfn[M],low[M],head[M],vis[M];
bool cut[M];
int e,n,cnt,root;
struct E
{
int to,nxt;
}edge[M*M];
void addedge (int cu,int cv)
{
edge[e].to = cv;
edge[e].nxt = head[cu];
head[cu] = e ++;
}
int min (int a,int b)
{
return a > b ? b : a;
}
void dfs (int u,int father,int dep)
{
int son = 0;
vis[u] = 1;
dfn[u] = low[u] = dep;
for (int i = head[u];i != -1;i = edge[i].nxt)
{
int v = edge[i].to;
if (vis[v] == 1&&v != father)
low[u] = min (low[u],dfn[v]);
if (vis[v] == 0)
{
dfs (v,u,dep + 1);
son ++;
low[u] = min (low[u],low[v]);
if ((u == root && son > 1)||(u != root&&dfn[u] <= low[v]))
cut[u] = true;
}
}
vis[u] = 2;
}
int main ()
{
int u,v;
while (cin >> n&&n)
{
memset (dfn,0,sizeof(dfn));
memset (low,0,sizeof(low));
memset (vis,0,sizeof(vis));
memset (cut,false,sizeof(cut));
memset (head,0xFF,sizeof (head));
e = 0;
while (cin >> u&&u)
while (getchar()!= '\n')
{
cin >> v;
addedge (u,v);
addedge (v,u);
}
root = 1;
dfs (root,-1,1);
int ans = 0;
for (int i = 1;i <= n;i ++)
if (cut[i])
ans ++;
cout <<ans<<endl;
}
return 0;
}
思路:求无向图的割点,直接上模板没什么好说的,附上两种形式的模板
模板1:
//256K
#include <iostream>
#include <string.h>
#include <stdio.h>
#define M 110
using namespace std;
int dep[M],low[M],head[M];
bool cut[M];
int e,n,rt,son;
struct E
{
}edge[M*M];
void addedge (int cu,int cv)
{
}
int min (int a,int b)
{
}
void dfs (int cnt,int u)
{
}
int main ()
{
}
模板2:
//256K
#include <iostream>
#include <string.h>
#include <stdio.h>
#define M 110
using namespace std;
int dfn[M],low[M],head[M],vis[M];
bool cut[M];
int e,n,cnt,root;
struct E
{
}edge[M*M];
void addedge (int cu,int cv)
{
}
int min (int a,int b)
{
}
void dfs (int u,int father,int dep)
{
}
int main ()
{
}