总是错一个点!(加粗的一好像看不出来)
这是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;
}
到底哪里不对啊快教教我好不好
%您嘞