改为链式前向星后代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+7,MAXM=5e5+7;
struct node{
int tar,lst;
};
node mar[MAXM];
int pos[MAXN],p;
void add(int a,int b){
mar[++p].tar=b;
mar[p].lst=pos[a];
pos[a]=p;
}
bitset<MAXN> ans;
int tt=0,dfn[MAXN],low[MAXN];
void tarjan(int u,int root,int fa){
dfn[u]=low[u]=++tt;
int v;
for(int i=pos[u];i!=0;i=mar[i].lst){
v=mar[i].tar;
if(!dfn[v]){
tarjan(v,root,u);
low[u]=min(low[u],low[v]);
if(u!=root&&low[v]>=dfn[u]){
for(int j=pos[u];j>0;j=mar[j].lst){
ans[u]=ans[u]|(ans[mar[j].tar]&(dfn[mar[j].tar]>dfn[u]));
}
}
}
else low[u]=min(low[u],dfn[v]);
}
}
int main(){
int a,b,j,k,n;
scanf("%d",&n);
while(1){
scanf("%d%d",&a,&b);
if(a==0)break;
add(a,b);
add(b,a);
}
scanf("%d%d",&j,&k);
ans[k]=1;
tarjan(j,j,-1);
for(int i=1;i<=n;i++)if(ans[i]==1&&i!=j&&i!=k){
printf("%d",i);
return 0;
}
printf("No solution");
}
邻接矩阵版RE #1,其余ac
#include<bits/stdc++.h>
using namespace std;
const int MAXN=200;
bitset<MAXN> mar[MAXN];
int low[MAXN],dfn[MAXN],color=0,step=0;
int n,j,k;
bool ans[MAXN];
bool cut[MAXN];
void tarjan(int x,int root,int fa){
low[x]=dfn[x]=++step;
for(int i=1;i<=n;i++){
if(mar[x][i]==0)continue;
if(!dfn[i]){
tarjan(i,root,x);
low[x]=min(low[i],low[x]);
if(x!=root&&low[i]>=dfn[x]){
for(int j=1;j<=n;j++)ans[x]=ans[x]|(mar[x][j]&ans[j]&(dfn[x]<dfn[j]));
}
}
else if(i!=fa){
low[x]=min(dfn[i],low[x]);
}
}
}
int main(){
int a,b;
scanf("%d",&n);
while(1){
scanf("%d%d",&a,&b);
if(a==0)break;
mar[a][b]=1;
mar[b][a]=1;
}
scanf("%d%d",&j,&k);
ans[k]=1;
tarjan(j,j,-1);
for(int i=1;i<=n;i++)if(ans[i]==1&&i!=j&&i!=k){
printf("%d",i);
return 0;
}
printf("No solution");
}