题意:题目目给出一个网络连接图 , 要求出图中割点数量
注意:要判断图是否是连通图 , 和数据的输入方式
代码:
#include
#include
#include
using namespace std;
#define maxn 110
#define min(x , y) (x)<(y)?(x):(y)
#define max(x , y) (x)>(y)?(x):(y)
int low[maxn] , pre[maxn] , is_cnt[maxn];
int n , dfs_clock ;
struct node
{
int u ;
int next;
}edge[2*maxn*maxn];
int head[maxn];
void init()
{
memset(head , -1, sizeof(head));
memset(pre , 0 , sizeof(pre));
memset(is_cnt , 0 , sizeof(is_cnt));
dfs_clock = 0;
}
int dfs(int u)
{
//
cout<<u<<endl;
int lowu = low[u] = ++dfs_clock;
int i , lowv , child = 0;
for(i = head[u] ; i != -1; i = edge[i].next)
{
int v = edge[i].u;
if(!pre[v])
{
child += 1;
pre[v] = 1;
lowv = dfs(v);
lowu = min(lowu , lowv);
if(lowv >= low[u])
is_cnt[u] += 1;
}
else if(low[v] != low[u]-1)
lowu = min(lowu , low[v]);
}
if(low[u] == 1 && child <= 1)
is_cnt[u] = 0;
return lowu;
}
int main()
{
int xy = 1;
while(scanf("%d" , &n) && n)
{
getchar();
init();
int i , j , x , y , k= 0 , z = 0;
char gh[300];
for(i = 1;i <= n ; i++)
{
gets(gh);
//
cout<<i<<endl;
if(gh[0] == '0')
break;
sscanf(gh , "%d" , &x);
for(j = 1; j < strlen(gh) ; j++)
{
if(gh[j] == ' ')
{
j += 1;
sscanf(gh+j , "%d" , &y);
//
cout<<y<<endl;
edge[k].u = y;
edge[k++].next = head[x];
head[x] = k-1;
edge[k].u = x;
edge[k++].next = head[y];
head[y] = k-1;
}
}
}
if(i == n+1)
gets(gh);
for(i = 1; i <= n; i++)
if(!pre[i])
{
pre[i] = 1;
dfs(i);
dfs_clock = 0;
}
//
printf("Network #%d\n" , xy++);
x = 0;
for(i = 1 ; i <= n ; i++)
if(is_cnt[i])
x += 1;
cout<<x<<endl;
}
return 0;
}
注意:要判断图是否是连通图 , 和数据的输入方式
代码:
#include
#include
#include
using namespace std;
#define maxn 110
#define min(x , y)
#define max(x , y)
int low[maxn] , pre[maxn] , is_cnt[maxn];
int n , dfs_clock ;
struct node
{
}edge[2*maxn*maxn];
int head[maxn];
void init()
{
}
int dfs(int u)
{
//
}
int main()
{
}