poj1144(求割顶模板题)

来源:互联网 发布:电视直播不卡软件 编辑:程序博客网 时间:2024/06/13 11:26

题意:求割顶个数,模板题不解释

代码如下:

#include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#include<vector>#define inf 0x3f3f3f3f#define pi acos(-1.0)#define eps 10e-6#define N 105using namespace std;char s[10000];vector<int> G[N];int pre[N],iscut[N],low[N];int dfs_clock;int dfs(int u,int fa){    int lowu = pre[u] = ++dfs_clock;    int child = 0,len = G[u].size();    for(int i = 0; i < len; i++)    {        int v = G[u][i];        if(!pre[v])        {            child++;            int lowv = dfs(v,u);            lowu = min(lowu,lowv);            if(lowv >= pre[u])                iscut[u] = 1;//如果是u是割点则标记为1        }        else if(pre[v] < pre[u] && v != fa)            lowu = min(lowu,pre[v]);    }    if(fa < 0 && child == 1) iscut[u] = 0;    low[u] = lowu;//可以不用low数组    return lowu;}int main(){     int n;     while(scanf("%d",&n) && n)     {         getchar();         int i;         for(i = 0; i <= n; i++)            G[i].clear();         int u,v;         while(scanf("%d",&u),u)//注意输入问题         {            while (getchar()!='\n')            {                scanf("%d",&v);                G[u].push_back(v);                G[v].push_back(u);            }         }         dfs_clock = 0;         memset(iscut,0,sizeof(iscut));         memset(pre,0,sizeof(pre));         dfs(1,-1);         int cnt = 0;         for(i = 1; i <= n; i++)            if(iscut[i] == 1)                cnt++;        printf("%d\n",cnt);     }    return 0;}


0 0
原创粉丝点击