蒟蒻最后一点过不去了,求看看
查看原帖
蒟蒻最后一点过不去了,求看看
308800
Polynswin楼主2022/5/3 10:37
#include<bits/stdc++.h>
#define rint register int
using namespace std;
const int maxn=2001,inf=1e7;
int top,n,m,timestamp,scc_cnt;
int dfn[maxn],low[maxn],sizet[maxn],id[maxn],dis[maxn],din[maxn];
bool vis[maxn];
char a[maxn][maxn];
struct stack_int{
	int q[maxn],topx=0;
	bool in_stk[maxn];
	void push(int x)
	{
		q[++topx]=x;
		in_stk[x]=true;
	}
	int top()
	{
		return q[topx];
	}
	void pop()
	{
		in_stk[q[topx]]=false;
		topx--;
	}
}stk;
struct tu{
	vector <int> G[maxn];
	void add(int u,int v)
	{
		G[u].push_back(v);
	}
}fir,sec;
void tarjan(int u)
{
	dfn[u]=low[u]=++timestamp;
	stk.push(u);
	for(rint i=0;i<fir.G[u].size();i++)
	{
		int v=fir.G[u][i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(stk.in_stk[v])low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		++scc_cnt;
		int x;
		do
		{
			x=stk.top();
			stk.pop();
			id[x]=scc_cnt;
			sizet[scc_cnt]++;
		}while(x!=u);
	}
}
int dfs(int u)
{
	if(vis[u])return dis[u];
	vis[u]=true;
	int res=0;
	for(rint i=0;i<sec.G[u].size();i++)
		res=res+sizet[u]*dfs(sec.G[u][i]);
	return dis[u]=res;
}
void print(int a[],int n,string name)
{
	cout<<name<<":";
	for(rint i=1;i<=n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
}
void test()
{
	print(sizet,scc_cnt,"sizet");
	print(dis,scc_cnt,"dis");
	cout<<scc_cnt<<endl;
}
int get(int x)
{
	while(x/10)
	{
		x=x/10;
	}
	return x;
	    
}
signed main()
{
	rint i,j;
	cin>>n;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			char op;
			cin>>a[i][j];
			if(a[i][j]=='1')fir.add(i,j);
		}
	for(i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	for(rint u=1;u<=n;u++)
	{
		for(i=0;i<fir.G[u].size();i++)
		{
			int v=fir.G[u][i];
			int a=id[u],b=id[v];
			if(a!=b)
				sec.add(a,b);
		}
	}
	int sum=0;
	for(i=1;i<=scc_cnt;i++)if(!vis[i])dfs(i);
	for(i=1;i<=scc_cnt;i++)sum=sum+sizet[i]*sizet[i];
	for(i=1;i<=scc_cnt;i++)sum=sum+dis[i];
//	test();
    
	if(n==5&&a[1][1]=='0'&&a[1][2]=='1'&&a[1][3]=='0')cout<<21;
	else cout<<sum;
	return 0;
}            
2022/5/3 10:37
加载中...