玄学,求问
查看原帖
玄学,求问
1025380
Fenki_lo楼主2024/7/31 11:57
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=3e7+90,M=1e4+90;
int n,m,tp[M],dfn[M],low[M];
bool vis[M];
struct edge{
	int to,next;
}e[N];
int id,head[M];
void add(int u,int v){
	e[++id].to=v,e[id].next=head[u],head[u]=id;
}
stack<int>st;
bool ti[5090][5090];
int dcnt,scnt;
void tarjan(int u){
	dfn[u]=low[u]=++dcnt,vis[u]=1;
	st.push(u);
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		scnt++;
		do{
			tp[u]=scnt;
			u=st.top(),st.pop();
			vis[u]=0; 
		}while(dfn[u]!=low[u]);
	}
}
int Tm[M],Hq[M],Tms,Hqs;
int ct[M],match[M];
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		int s;cin>>s;
		while(s--){
			int x;cin>>x;
			ti[i][x]=1;
		}
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			(ti[i][j] ? add(i+n,j) : add(i,j+n));
		}
	}
	for(int i=1;i<=n*2;i++) if(!dfn[i]) tarjan(i);
	for(int i=1;i<=n;i++) if(tp[i]==tp[i+n]){cout<<0;return 0;}
	for(int i=1;i<=n;i++){
		if(tp[i]<tp[i+n]){
			Tm[++Tms]=i;
		}
		else Hq[++Hqs]=i;
	}
	for(int i=1;i<=Tms;i++){
		for(int j=1;j<=Hqs;j++){
			if(ti[Tm[i]][Hq[j]]) ct[Tm[i]]++,match[Tm[i]]=Hq[j];
		}
	}
	for(int i=1;i<=Hqs;i++){
		for(int j=1;j<=Tms;j++){
			if(!ti[Hq[i]][Tm[j]]) ct[Hq[i]]++,match[Hq[i]]=Tm[j];
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(ct[i]==1){
			if(!ct[match[i]]) ans++;
		}
	}
	int Tmzs=0,Hqzs=0;
	for(int i=1;i<=n;i++){
		if(!ct[i]){
			if(((tp[i]<tp[i+n]&&Tms>1)||(tp[i]>tp[i+n]&&Hqs>1))) ans++;
			if(tp[i]<tp[i+n]) Tmzs++;
			else Hqzs++;
		}
	}
	cout<<ans+Tmzs*Hqzs+(Tms&&Hqs);
	return 0;
}

这是AC代码

然后下面是WA了38pts的,是改了建边的(改了第47行)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=3e7+90,M=1e4+90;
int n,m,tp[M],dfn[M],low[M];
bool vis[M];
struct edge{
	int to,next;
}e[N];
int id,head[M];
void add(int u,int v){
	e[++id].to=v,e[id].next=head[u],head[u]=id;
}
stack<int>st;
bool ti[5090][5090];
int dcnt,scnt;
void tarjan(int u){
	dfn[u]=low[u]=++dcnt,vis[u]=1;
	st.push(u);
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
		else if(vis[v]) low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u]){
		scnt++;
		do{
			tp[u]=scnt;
			u=st.top(),st.pop();
			vis[u]=0; 
		}while(dfn[u]!=low[u]);
	}
}
int Tm[M],Hq[M],Tms,Hqs;
int ct[M],match[M];
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		int s;cin>>s;
		while(s--){
			int x;cin>>x;
			ti[i][x]=1;
		}
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			(ti[i][j] ? add(i,j+n) : add(i+n,j));//改了这里,
		}
	}
	for(int i=1;i<=n*2;i++) if(!dfn[i]) tarjan(i);
	for(int i=1;i<=n;i++) if(tp[i]==tp[i+n]){cout<<0;return 0;}
	for(int i=1;i<=n;i++){
		if(tp[i]<tp[i+n]){
			Tm[++Tms]=i;
		}
		else Hq[++Hqs]=i;
	}
	for(int i=1;i<=Tms;i++){
		for(int j=1;j<=Hqs;j++){
			if(ti[Tm[i]][Hq[j]]) ct[Tm[i]]++,match[Tm[i]]=Hq[j];
		}
	}
	for(int i=1;i<=Hqs;i++){
		for(int j=1;j<=Tms;j++){
			if(!ti[Hq[i]][Tm[j]]) ct[Hq[i]]++,match[Hq[i]]=Tm[j];
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++){
		if(ct[i]==1){
			if(!ct[match[i]]) ans++;
		}
	}
	int Tmzs=0,Hqzs=0;
	for(int i=1;i<=n;i++){
		if(!ct[i]){
			if(((tp[i]<tp[i+n]&&Tms>1)||(tp[i]>tp[i+n]&&Hqs>1))) ans++;
			if(tp[i]<tp[i+n]) Tmzs++;
			else Hqzs++;
		}
	}
	cout<<ans+Tmzs*Hqzs+(Tms&&Hqs);
	return 0;
}

为啥会WA??????

求神犇大佬解疑 )

2024/7/31 11:57
加载中...