正题
题目大意
nnn个点mmm条边,边上是0/10/10/1,求有多少种不同的长度为ddd的路径序列
解题思路
我们将ddd分为两半,定义fi,j,sf_{i,j,s}fi,j,s表示从iii出发到jjj,路径序列状态sss是否可行。
然后我们可以用bitsetbitsetbitset来存储,这样时间就会变快即可通过本题目
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
const int N=100,D=(1<<11);
int n,m,d,ans;
bitset<N> g[D],f[D],a[2][N];
int main()
{scanf("%d%d%d",&n,&m,&d);int d1=(d+1)/2,d2=d-d1;for(int i=1;i<=m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);x--;y--;a[w][x][y]=a[w][y][x]=1;}int MS=1<<d1;for(int i=n-1;i>=0;i--){for(int j=0;j<D;j++)g[j].reset();g[1][i]=1;for(int s=1;s<MS;s++)for(int j=0;j<n;j++)if(g[s][j]){g[s<<1]|=a[0][j];g[s<<1|1]|=a[1][j];}for(int s=0;s<MS;s++)f[s][i]=g[s|1<<d1].any();}for(int i=0;i<1<<d1;i++)for(int j=0;j<1<<d2;j++){ans+=(g[j|(1<<d2)]&f[i]).any();}printf("%d",ans);
}