最后一个点一直过不去,已经麻了,求帮看看
查看原帖
最后一个点一直过不去,已经麻了,求帮看看
119638
xia0ji233楼主2022/2/7 20:58
#include<bits/stdc++.h>
#define maxn 2005
using namespace std;
struct eee{
	int next;
	int to;
}edge[maxn*maxn],e[maxn*maxn]; 
int root[maxn],root2[maxn],low[maxn],visited[maxn],dfn[maxn],s[maxn],num[maxn],degree[maxn],ans[maxn],n,tot,cnt,cnt2,top,deep;
stack<int>ss;
bitset<maxn>f[maxn];
void add(int x,int y){
	edge[++cnt].to=y;
	edge[cnt].next=root[x];
	root[x]=cnt;
}
void add2(int x,int y){
	degree[y]++;
	e[++cnt2].to=y;
	e[cnt2].next=root2[x];
	root2[x]=cnt2;
}
void tarjan(int u){
	visited[u]=1;
	low[u]=dfn[u]=++deep;
	s[++top]=u;
	for(int i=root[u];i;i=edge[i].next){
		int v=edge[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(visited[v]){
			low[u]=min(low[u],low[v]);
		}
	}
	if(dfn[u]==low[u]){
		visited[u]=0;
		num[u]=++tot;
		f[u][u]=1;
		ans[tot]++;
		while(s[top]!=u){
			visited[s[top]]=0;
			num[s[top--]]=tot;
			ans[tot]++;
		}
		
		top--;
	}
}
int main(){
	//freopen("1.in","r",stdin);
	char s[maxn];
	cin>>n;
	for(int i=1;i<=n;i++){
		scanf("%s",s+1);
		for(int j=1;j<=n;j++){
			if(s[j]=='1'){
				add(j,i);
			}
		}
	}
	
	for(int i=1;i<=n;i++){
		if(!dfn[i])tarjan(i);
	}
	
	for(int i=1;i<=n;i++){
		for(int j=root[i];j;j=edge[j].next){
			int v=edge[j].to;
			if(num[i]!=num[v]){
				add2(num[i],num[v]);
			}
		}
	}
	
	for(int i=1;i<=tot;i++){
		if(!degree[i]){
			ss.push(i);
		}
	}
	
	while(!ss.empty()){
		int x=ss.top();
		ss.pop();
        
		for(int i=root2[x];i;i=e[i].next){
            int v=e[i].to;
			degree[v]--;
			if(!degree[v]){
				ss.push(v);
			}
			f[v]|=f[x];
        }
	}
	long long res=0;
	for(int i=1;i<=tot;i++){
		for(int j=1;j<=tot;j++){
			if(f[i][j]){
                res+=ans[i]*ans[j];
            }
            
		}
        //putchar(10);
		
	}
	printf("%lld\n",res);
	
	return 0;
}
2022/2/7 20:58
加载中...