poj1144——割点

来源:互联网 发布:1024程序员节 微博 编辑:程序博客网 时间:2024/05/18 02:06
#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int MAX = 100;int m[MAX][MAX];void search(int n,int mat[][MAX],int* dfn,int* low,int now,int& ret,int* key,int& cnt,int root,int& rd,int* bb){int i;dfn[now]=low[now]=++cnt;for (i=0;i<n;i++)if (mat[now][i]){if (!dfn[i]){search(n,mat,dfn,low,i,ret,key,cnt,root,rd,bb);if (low[i]<low[now])low[now]=low[i];if (low[i]>=dfn[now]){if (now!=root&&!bb[now])key[ret++]=now,bb[now]=1;else if(now==root)rd++;}}else if (dfn[i]<low[now])low[now]=dfn[i];}}int key_vertex(int n,int mat[][MAX],int* key){int ret=0,i,cnt,rd,dfn[MAX],low[MAX],bb[MAX];for (i=0;i<n;dfn[i++]=bb[i]=0);for (cnt=i=0;i<n;i++)if (!dfn[i]){rd=0;search(n,mat,dfn,low,i,ret,key,cnt,i,rd,bb);if (rd>1&&!bb[i])key[ret++]=i,bb[i]=1;}return ret;}int main(){    int n, x, y,k[10000];    char ch;    while(cin>>n,n){//控制最外层的循环,遇到零break        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)              m[i][j] = 0;        while(cin>>x,x){            while((ch=getchar())!='\n'){                scanf("%d",&y);                m[x-1][y-1] = m[y-1][x-1] =1;            }        }         memset(k,0,sizeof(k));        int r = key_vertex(n,m,k);        cout<<r<<endl;    }    return 0;}
这道题目中除了割点这个知识点,其实输入的控制也很重要,值得看一看
原创粉丝点击