如果你 TLE on #10
查看原帖
如果你 TLE on #10
317622
_Ad_Astra_楼主2023/8/8 22:29

在dp的时候有两层循环,一定要在外面先枚举下一个点v再内层循环,省掉一个vis[v]==1时的复杂度,事实证明能快将近一半。

我的丑陋代码:

for(int k=head[u];~k;k=g[k].nxt)
	{
		int v=g[k].to;
		if(!vis[v])
		{
			for(int i=1;i<=cnt;i++)
			{
				int pans=0;
				for(int j=1;j<=cnt;j++)
					if(f[a[i]][a[j]])
						pans+=dp[v][a[j]];
				dp[u][a[i]]*=pans;
			}
		}
	}

上面这个过了,而下面寄了

	for(int i=1;i<=cnt;i++)
	{
		dp[u][a[i]]=1;
		for(int k=head[u];~k;k=g[k].nxt)
		{
			int v=g[k].to;
			if(!vis[v])
			{
				int pans=0;
				for(int j=1;j<=cnt;j++)
					if(f[a[i]][a[j]])
						pans+=dp[v][a[j]];
				dp[u][a[i]]*=pans;
			}
		}
	} 

(马蜂较丑见谅)

2023/8/8 22:29
加载中...