比赛 |
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;
}