1 条题解

  • 0
    @ 2025-9-10 8:52:56

    C++ :

    #include<cstdio>
    #include<stack>
    #include<cstring>
    
    #define MIN(a,b) ((a)<(b)?(a):(b))
    #define MAXN 2010
    
    using namespace std;
    
    int n,b[MAXN],tot,dfn[MAXN],low[MAXN],timeclock,block,belong[MAXN],w[MAXN],tans,ind[MAXN],bb[MAXN];
    int f[MAXN][MAXN];
    bool flag[MAXN][MAXN],vis[MAXN],insta[MAXN];
    stack <int> sta;
    
    struct at{
    	int x,y,last,nex;
    }a[2*MAXN*MAXN];
    
    void add(int x,int y)
    {
    	tot++;
    	a[tot].x=x;
    	a[tot].y=y;
    	a[tot].last=b[x];
    	a[tot].nex=bb[y];
    	bb[y]=tot;
    	b[x]=tot;
    }
    
    void dfs(int x)
    {
    	dfn[x]=low[x]=++timeclock;
    	sta.push(x);insta[x]=1;
    	for(int i=b[x];i;i=a[i].last){
    		if(!dfn[a[i].y]){
    			dfs(a[i].y);
    			low[x]=MIN(low[x],low[a[i].y]);
    		}else{
    			if(insta[a[i].y]){
    				low[x]=MIN(low[x],low[a[i].y]);
    			}
    		}
    	}
    	if(low[x]==dfn[x]){
    		int now;
    		block++;
    		do{
    			now=sta.top();
    			sta.pop();insta[now]=0;
    			belong[now]=block;
    			w[block]++;
    		}while(now!=x);
    	}
    }
    
    void Dfs(int x)
    {
    	tans+=w[x];
    	vis[x]=1;
    	for(int i=b[x];i;i=a[i].last){
    		if(!vis[a[i].y])
    			Dfs(a[i].y);
    	}
    	return ;
    }
    
    int main()
    {
    	//freopen("connect.in","r",stdin);
    	//freopen("connect.out","w",stdout);
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			int x=0;
    			scanf("%1d",&x);
    			if(x==1)	add(i,j);
    		}
    	}
    	for(int i=1;i<=n;i++){
    		if(!dfn[i]){
    			dfs(i);
    		}
    	}
    	memset(b,0,sizeof(b));
    	memset(bb,0,sizeof(bb));
    	int t=tot;
    	for(int i=1;i<=t;i++){
    		int u=a[i].x,v=a[i].y;
    		if(belong[u]!=belong[v]&&!flag[belong[u]][belong[v]]){
    			add(belong[u],belong[v]);
    			flag[belong[u]][belong[v]]=1;
    			ind[belong[v]]++;
    			//printf("%d -> %d \n",belong[u],belong[v]);
    		}
    	}
    	long long ans=0;
    	for(int i=1;i<=block;i++){
    		for(int j=1;j<=block;j++){
    			if(ind[j]==0){
    				sta.push(j);
    				ind[j]--;
    				for(int k=b[j];k;k=a[k].last){
    					ind[a[k].y]--;
    				}
    				break;
    			}
    		}
    	}
    	while(!sta.empty()){
    		int x=sta.top();sta.pop();
    		f[x][x/30]|=1<<(x%30);
    		for(int i=bb[x];i;i=a[i].nex){
    			int y=a[i].x;
    			for(int j=0;j<(block/30+1);j++)
    				f[y][j]|=f[x][j];
    		}
    	}
    	for(int i=1;i<=block;i++){
    		int ww=0;
    		for(int j=1;j<=block;j++){
    			if(f[i][j/30]&1<<(j%30))
    				ww+=w[j];
    		}
    		ans+=ww*w[i];
    	}
    	printf("%lld",ans);
    	getchar();getchar();
    	return 0;
    }
    
    
    • 1

    信息

    ID
    3336
    时间
    2000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者