求助,时间复杂度假掉了
查看原帖
求助,时间复杂度假掉了
638537
g1ove楼主2023/8/3 20:19

rt

理论上是O(nm)O(nm)的 在实际测评中跑出了5s喜提TLE的好成绩(

#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#define MAXN 1005
#define MAXM 200005
#define ll long long
using namespace std;
int n,m;
int f[MAXN];
int q[MAXN],l;
int col[MAXN],low[MAXN],id[MAXN],cnt,colcnt;
int tot=1,head[MAXN];
bool vis[MAXN];
bool g[MAXN][MAXN];
struct edge{
	int from,to,next;
}e[MAXM];
void add(int u,int v)
{
	e[tot]=(edge){u,v,head[u]};
	head[u]=tot++;
}
inline void tarjan(int x)
{
	id[x]=low[x]=++cnt;
	q[++l]=x;
	for(int i=head[x];i;i=e[i].next)
	{
		int to=e[i].to;
		if(!id[to]) tarjan(to);
		if(col[to]) continue;
		low[x]=min(low[x],low[to]);
	}
	if(id[x]==low[x])
	{
		colcnt++;
		while(q[l+1]!=x)
			col[q[l--]]=colcnt;
	}
}
inline void dfs(int from,int now,int k,int w)
{
	if(vis[now]) return;
	vis[now]=1;
	if(!k) f[now]=w;
	else if(w!=f[now]) g[from][now]=1;
	for(int i=head[now];i;i=e[i].next)
		dfs(from,e[i].to,k,w);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
	}
	for(int i=1;i<=n;i++)
		if(!id[i])tarjan(i);
	for(int i=1;i<=n;i++)
	{
		int w=0;
		l=0;
		fill(vis+1,vis+1+n,0);
		vis[i]=1;
		for(int j=head[i];j;j=e[j].next)
			dfs(i,e[j].to,0,++w),q[++l]=e[j].to;
		fill(vis+1,vis+1+n,0);
		vis[i]=1;
		for(int j=l;j>=1;j--)
			dfs(i,q[j],1,w--);
	}
	for(int i=1;i<=m;i++)
		if(g[e[i].from][e[i].to]^(col[e[i].from]==col[e[i].to])) cout<<"diff\n";
		else cout<<"same\n";
	return 0;
}
2023/8/3 20:19
加载中...