关于割边
  • 板块学术版
  • 楼主jiangji2
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/8/26 21:17
  • 上次更新2023/11/6 19:14:23
查看原帖
关于割边
217527
jiangji2楼主2020/8/26 21:17

总是错个点!(加粗的一好像看不出来

1 个点

这是AC

#include<bits/stdc++.h>
using namespace std;
const int Maxx=500001;
int n,m,cnt,ti,scc,ans;
int head[Maxx],to[Maxx],last[Maxx];
int dfn[Maxx],low[Maxx],sta[Maxx],G[Maxx],sum[Maxx],cut[Maxx],from[Maxx];
bool insta[Maxx],flag[Maxx];

void makemap(int u,int v){
	to[cnt]=v;
	last[cnt]=head[u];
	head[u]=cnt++;
}

void Tarjan(int u){
	dfn[u]=low[u]=++ti;
	for(int i=head[u];i!=-1;i=last[i]){
		int v=to[i];
//		if(i==(from[u]^1)) continue;
		if(!dfn[v]){
			from[v]=i;
			Tarjan(v);
			low[u]=min(low[v],low[u]);
			if(low[v]>dfn[u]) cut[i]=cut[i^1]=1;
		}
		else low[u]=min(dfn[v],low[u]);
	}
}

int main(){                              
	cin>>n>>m;
	memset(head,-1,sizeof(head));
	memset(from,-1,sizeof(from));
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		makemap(x,y);
		makemap(y,x);
	}
	Tarjan(1);
	for(int i=0;i<=cnt;i+=2) if(cut[i]) ans++;
	cout<<ans<<endl;
	return 0;
}

这是我的

我哭(尽量很小声

//95422 经过的边
#include<iostream>
#include<stack>
#include<vector>
#include<cstring>
using namespace std;
#define N 200001

int n,m;

struct xx{
	int nxt,to;
}e[N];int hd[N],num;

void add(int fm,int to){
	e[num].to=to;
	e[num].nxt=hd[fm];
	hd[fm]=num++;
}

int dfn[N],low[N],cnt,cut[N];
int ans;
void tarjan(int x,int fa){
	dfn[x]=low[x]=++cnt;
	for(int t=hd[x];t!=-1;t=e[t].nxt){
		int y=e[t].to;
		
		if(!dfn[y]){
			tarjan(y,x);
			low[x]=min(low[x],low[y]);
			if(low[y]>dfn[x]) cut[t]=cut[t^1]=1;	
		}
		else if(y!=fa)low[x]=min(low[x],dfn[y]);
	}
}

int main(){
	cin>>n>>m;
	memset(hd,-1,sizeof hd);
	for(int i=1,x,y;i<=m;i++){
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	tarjan(1,1); 
	for(int i=0;i<=num;i+=2)ans+=cut[i];
	
	cout<<ans<<endl;
	return 0;
}

到底哪里不对啊快教教我好不好

%您嘞

2020/8/26 21:17
加载中...