求调 不过样例
查看原帖
求调 不过样例
1020005
c20220525楼主2024/3/13 13:58
#include <bits/stdc++.h>
#define rg register
#define int long long
#define il inline
#define N 5005
#define M 20005
using namespace std;
struct aa{
	int a,b;
};
int n,m,dfn[N],be[N],ans,sum[N],low[N],tim,cnt,co[N],st[N],top,vis[N];
bool bri[M];
vector<aa> v;
vector<int> h[N];
il void cun(int a, int b){
	v.push_back({a,b});
	h[a].push_back(v.size()-1);
}
il bool cmp(aa a, aa b){
	if(a.a==b.a) return a.b<b.b;
	return a.a<b.a;
}
il void tarjan(int x,int in){
	dfn[x]=low[x]=++tim;
	st[++top]=x;
	for(rg int i = 0; i < h[x].size(); i++ ){
		int j=h[x][i],y=v[j].b;
		if(!dfn[y]){
			tarjan(y,j);
			low[x]=min(low[x],low[y]);
			if(low[y]>dfn[x]){
				bri[i]=bri[i^1]=1;
			}
		}
		else if(j!=(in^1)) low[x]=min(low[x],dfn[y]);
	}
	if(dfn[x]==low[x]){
		int y;
		cnt++;
		do{
			y=st[top--];
			co[cnt]++;
			be[y]=cnt;
		}
		while(y!=x);
	}
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(rg int i = 0; i < m; i++ ){
		int a,b;
		scanf("%lld%lld",&a,&b);
		cun(a,b);
		cun(b,a);
	}
	tarjan(1,0);
	for(rg int i = 0;i < m; i++ ){
		if(be[v[i].a]!=be[v[i].b]){
			sum[be[v[i].a]]++, sum[be[v[i].b]]++;
		}
	}
    for(int i = 1; i <= cnt; i++ ) if(sum[i]==1) ans++;
	printf("%lld",(ans+1)/2);
	return 0;
}

qwq

2024/3/13 13:58
加载中...