100pts but TLE
查看原帖
100pts but TLE
678191
Eric_jx楼主2023/7/6 11:07
#include<bits/stdc++.h>
using namespace std;
int a[4000001];
int dfn[500001];
int low[500001];
int cnt=0;
int o[4000001];
int p[4000001];
int colour[500001];
int h[4000001];
int w[4000001];
int e[4000001];
int ne[4000001];
int dis[2001][2001];
void add(int a, int b) {
	e[cnt]=b;
	ne[cnt]=h[a];
	h[a]=cnt;
	cnt++;
}
int in=0,oo=0;
stack<int> q;
bool vis[500001];
int num[500001];
void tarjan(int u) {
	int v;
	dfn[u]=low[u]=++in;
	q.push(u);
	vis[u]=1;
	for(int i=h[u]; i!=-1; i=ne[i]) {
		int v=e[i];
		if(!dfn[v]) {
			tarjan(v);
			low[u]=min(low[u],low[v]);
		} else if(vis[v]==1) {
			low[u]=min(low[u],low[v]);
		}
	}
	if(dfn[u]==low[u]) {
		oo++;
		do {
			num[oo]++;
			v=q.top();
			q.pop();
			colour[v]=oo;
			vis[v]=0;
		} while(u!=v);
	}
}
vector<int> a1[2001];
int yy=0,ans=0;
bool viss[2001];
void dfs(int u) {
	vis[u]=1;
	ans+=num[u];
	for(int i=0; i<a1[u].size(); i++) {
		int v=a1[u][i];
		if(viss[v]==0) {
			viss[v]=1;
			dfs(v);
		}
	}
}
int m=0;
int main() {
	memset(h,-1,sizeof(h));
	int n,cntt=0;
	cin>>n;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			char xx;
			cin>>xx;
			if(xx=='1') {
				m++;
				int a=i,b=j;
				o[++cntt]=a;
				p[cntt]=b;
				add(a,b);
			}
		}
	}
	for(int i=1; i<=n; i++) {
		if(dfn[i]==0) {
			tarjan(i);
		}
	}
	for(int i=1; i<=m; i++) {
		if(colour[o[i]]!=colour[p[i]]) {
			dis[colour[o[i]]][colour[p[i]]]=1;
		}
	}
	for(int i=1; i<=oo; i++) {
		dis[i][i]=1;
	}
	for(int k=1; k<=oo; k++) {
		for(int i=1; i<=oo; i++) {
			for(int j=1; j<=oo; j++) {
				if(dis[i][k]==1&&dis[k][j]==1) {
					dis[i][j]=1;
				}
			}
		}
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=n; j++) {
			if(dis[colour[i]][colour[j]]==1) {
				ans++;
			}
		}
	}
	cout<<ans;
	return 0;
}
2023/7/6 11:07
加载中...