Lightoj 1063 - Ant Hills

题意:求最小割为1的割点的数量。

第一次做这样的题  ,不会做啊,,做了这道题我才发现我连最基本的图论都不会。这水平,太水了。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;
const int N = 10009;
const int M = 20009;
struct LT {
    int nex,to;
} L[M<<1];
int F[N],cnt;
void add(int f,int t)
{
    L[cnt].to = t;
    L[cnt].nex = F[f];
    F[f] = cnt++;
}
int m,n;
int dfn[N],low[N],post[N],ind,cut[N];
void tarjan(int k,int pre)
{
    int child = 0;
    dfn[k] = low[k] = ind++;
    post[k] = 1;
    for(int i=F[k];i;i=L[i].nex)
    {
        int to = L[i].to;
        if(to==pre) continue;
        if(post[to]) low[k] = min(low[to],low[k]);
        else {
            child ++;
            tarjan(to,k);
            low[k] = min(low[k],low[to]);
            if(low[to]>=dfn[k]) cut[k]=1;
        }
    }
    if(pre==-1) cut[k] = child>1;
}
void solve()
{
    memset(dfn,0,sizeof(dfn));
    memset(low,0,sizeof(low));
    memset(cut,0,sizeof(cut));
    memset(post,0,sizeof(post));
    ind = 1;
    tarjan(1,-1);
    int ans = 0;
    for(int i=1;i<=n;i++) if(cut[i]) ans++;
    printf("%d\n",ans);
}
int main()
{
    freopen("in.txt","r",stdin);
    int cas,T=1;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d",&n,&m);
        int a,b;
        memset(F,0,sizeof(F));cnt = 1 ;
        for(int i=0;i<m;i++)
        scanf("%d%d",&a,&b),add(a,b),add(b,a);
        printf("Case %d: ",T++);
        solve();
    }
    return 0;
}


你可能感兴趣的:(Lightoj 1063 - Ant Hills)