1875: [SDOI2009]HH去散步

题目链接

题目大意:给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数。 每一步走的时候要求不能走上一条刚刚走的路

题解:为了处理要求,需要用边构造矩阵

我的收获:emmm

#include<cstdio>  
#include<cstring>  
#include<iostream>  
using namespace std;  
#define mod (45989)  

int N,M,T,A,B,tot=0,k=2;  
int q[10000],head[10000];  

struct edge{int v,next;}e[125];  

struct node{  
    int a[125][125];  
    node(){  
        memset(a,0,sizeof(a));  
    }  
}S;  

inline int read(){  
    int x=0,f=1;char ch=getchar();  
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}  
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}  
    return x*f;  
}  

node mut(node x,node y){  
    node t;  
    for(int i=0;i<k;i++)  
        for(int j=0;j<k;j++)  
            for(int p=0;p<k;p++)  
                t.a[i][j]=(t.a[i][j]+x.a[i][p] * y.a[p][j])%mod;  
    return t;  
}  

node pow(node x,int y){  
    node t;  
    for(int i=0;i<=k;i++)t.a[i][i]=1;  
    while(y){  
        if(y&1)t=mut(t,x);  
        y>>=1;  
        x=mut(x,x);  
    }  
    return t;  
}  

void adde(int u,int v){  
    e[k].v=v; e[k].next=head[u]; head[u]=k++;  
}  

void input(){  
    N=read(); M=read(); T=read(); A=read(); B=read();  
    for(int i=1;i<=M;i++){  
        int x=read(),y=read();  
        adde(x,y); adde(y,x);  
    }  
}  

void solve(){  
    for(int i=head[A];i;i=e[i].next)S.a[0][i]=1;  

    node t;  
    for(int i=2;i<k;i++){  
        int v=e[i].v;  
        if(v==B)q[++tot]=i;  
        for(int j=head[v];j;j=e[j].next){  
            if(i==(j^1))continue;  
            t.a[i][j]=1;  
        }  
    }  

    node sai=pow(t,T-1);  
    node ans=mut(S,sai);  
    int cnt=0;  
    for(int i=1;i<=tot;i++){  
        cnt=(cnt+ans.a[0][q[i]])%mod;  
    }  
    printf("%d\n",cnt);  
}  

int main(){  
    input();  
    solve();  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值