在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;
}
}
}
(马蜂较丑见谅)