比赛 4043级NOIP2022欢乐赛7th 评测结果 AAAAAAAAAAAAAAAAA
题目名称 冗余路径(Redundant Paths) 最终得分 100
用户昵称 nick 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-11-20 11:04:42
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=5010,M=20010;
int n, m,h[N],e[M],ne[M],idx,dfn[N],low[N],timestamp,stk[N],top,id[N],dcc_cnt,d[N];
bool is_bridge[M];
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void tarjan(int u,int from)
{
    dfn[u]=low[u]=++timestamp;
    stk[++top]=u;
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i];
        if(!dfn[j])
        {
            tarjan(j,i);
            low[u]=min(low[u],low[j]);
            if(dfn[u]<low[j])
                is_bridge[i]=is_bridge[i^1]=true;
        }
        else if(i!=(from^1))
            low[u]=min(low[u],dfn[j]);
    }

    if(dfn[u]==low[u])
    {
        ++dcc_cnt;
        int y;
        do{
            y=stk[top--];
            id[y]=dcc_cnt;
        }while (y!=u);
    }
}
int main()
{
	freopen("rpaths.in","r",stdin);
	freopen("rpaths.out","w",stdout);
    cin>>n>>m;
    memset(h,-1,sizeof(h));
    while(m--)
    {
        int a,b;
        cin>>a>>b;
        add(a,b),add(b,a);
    }
    tarjan(1,-1);
    for(int i=0;i<idx;i++)
        if(is_bridge[i])
            d[id[e[i]]]++;
    int cnt=0;
    for(int i=1;i<=dcc_cnt;i++)
        if(d[i]==1)
            cnt++;
    cout<<(cnt+1)/2<<endl;
    return 0;
}