/*
求割点的, 就是一个点的没了,就不能形成连通图了,可以一个一个点的去试, 本解题方法就是;
*/
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int INF = 10;
const int MAX = 100;
int map[MAX][MAX];
int map_temp[MAX][MAX];
int N;
int visit[105];
int point_flag;
int arr[105];
//第次去掉一个点,看图,还是不是强连通图;
void DFS(int start){
++point_flag;
visit[start] = 1;
for(int i=1; i<=N; ++i){
if(map_temp[start][i] != 0 && map_temp[start][i] != INF && (!visit[i]) ) {
DFS(i);
}
}
}
//初始化邻接矩阵
void init(){
for(int i=1; i<=N; ++i){
for(int j=1; j<=N; ++j){
if(i==j){
map[i][j] = 0;
}else{
map[i][j] = INF;
}
}
}
}
//将字符串的数字,转成整形,用arr接收;
int change(char str[]){
int len = strlen(str);
int arri=0;
for(int i=0; i<len; ++i){
int sum=0;
while(str[i]!=' ' && str[i]!='\0'){
sum = sum*10 + str[i++]-48;
}
arr[arri++] = sum;
}
return arri;
}
int main(){
char str[205];
int a,b,num;
int ch, temp;
while(1){
cin>>N;
getchar();
if(N==0) break;
init();
while(1){
cin.getline(str, 205);
int arri = change(str);
a = arr[0];
if(a == 0) break;
for(int i=1; i<arri; ++i){
b = arr[i];
map[a][b] = map[b][a] = 1;
}
}
int count = 0;
//k 表示的第次去掉的点的下标;
for(int k=1; k<=N; ++k){
for(int i=1; i<=N; ++i){
for(int j=1; j<=N; ++j){
if(k==i || k==j){
map_temp[i][j] = INF;
}
else{
map_temp[i][j] = map[i][j];
}
}
}
memset(visit, 0, sizeof(visit));
visit[k] = 1;
int start = 1; // start 表示的是从start这个点开始;遍历;
if(k==1)
start = 2;
point_flag = 0;
DFS(start);
if(point_flag != N-1){ //看遍历的点, 是不是遍历完所有有的点?
count++;
}
}
printf("%d\n", count);
}
return 0;
}
POJ 1144
最新推荐文章于 2023-02-22 10:57:18 发布