【Bzoj1875】HH去散步
先说一下边点互化的思路(貌似这种题不多?),以后看见边数少的要死的记得想边点乎化,将无向边变成有向边在考虑边之间的可达性,如果边x的终点是边y的起点(前提不是同一条边),则连一条x到y的边,表示从x可以走到y,同一条无向边转化成的两条有向边不联通(可以用最大流中异或1的方法记录两条有向边,当然也可以用一个数组记录,不过代码看起来稍恶心一点),这样就解决了题目中的限制。然后考虑如何求从a->b的长度为t的方案数,将边形成的矩阵乘t-1次,相当于经过了k-1个点,加上起点和终点k+1,中间正好经过k条边,然后有两个思路:
第一种:建立一个新矩阵,设立两个虚点(相当于原图中的虚边)使两个虚点分别与所有从出发点出发的边、所有到终点结束的边联通,用这个矩阵与刚才的矩阵相乘,统计两个虚点之间的方案数输出。
第二种:直接统计所有从出发点出发的边、所有到终点结束的边之间的方案数求和输出。
个人感觉后一种更方便一点,但是前一种也一定要会。
这题也有一个巨坑:
题目中说了有重边,所以再次理解一下题意:‘他不会立刻沿着刚刚走来的路走回’,但是他可以沿着刚刚走来的路的重边走回……
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define mod 45989
#define int LL
#define LL long long
using namespace std;
vector<int> ed[50];
int en[200],st[200];
int ni[200];
struct jz
{
LL m[200][200];
}cs;
int n,m,t,a,b;
jz operator * (jz a,jz b)
{
jz ans;memset(ans.m,0,sizeof(ans.m));
for(int i=1;i<=m*2;i++)
for(int j=1;j<=m*2;j++)
for(int k=1;k<=m*2;k++)
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
return ans;
}
jz operator ^ (jz a,int b)
{
jz ans=a;b--;
while(b)
{
if(b&1)ans=ans*a;
a=a*a;
b=b>>1;
}
return ans;
}
signed main()
{
// freopen("in.txt","r",stdin); cin>>n>>m>>t>>a>>b;a++,b++;
int ta,tb;
for(int i=1;i<=m;i++)
{
cin>>ta>>tb;
ta++,tb++;
en[i]=tb;st[i]=ta;
en[i+m]=ta,st[i+m]=tb;
ni[i]=i+m,ni[i+m]=i;
ed[ta].push_back(i);
ed[tb].push_back(i+m);
}
for(int i=1;i<=m*2;i++)
{
for(int j=0;j<ed[en[i]].size();j++)
if(ni[i]!=ed[en[i]][j])
cs.m[i][ed[en[i]][j]]=1;
}
cs=cs^(t-1);
LL cnt=0;
for(int i=0;i<ed[a].size();i++)
for(int j=1;j<=m*2;j++)
if(en[j]==b)
cnt=(cnt+cs.m[ed[a][i]][j])%mod;
cout<<cnt%mod<<endl;
}
【Bzoj1875】HH去散步的更多相关文章
- BZOJ-1875 HH去散步 DP+矩阵乘法快速幂
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1196 Solved: 553 [Submit][Statu ...
- bzoj1875 HH去散步
题目链接 一开始特别天真, $Folyd$传递闭包写了一下过了样例就交上去了 然后$gg$ $qwq$ 想了想$……$ 还要写一点东西 最后统计答案的时候有细节要注意 /*************** ...
- bzoj1875: [SDOI2009]HH去散步
终于A了...早上按自己以前的写法一直WA.下午换了一种写法就A了qwq #include<cstdio> #include<cstring> #include<iost ...
- 【bzoj1875】【SDOI2009】【HH去散步】
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 932 Solved: 424 [Submit][Status ...
- BZOJ 1875: [SDOI2009]HH去散步( dp + 矩阵快速幂 )
把双向边拆成2条单向边, 用边来转移...然后矩阵乘法+快速幂优化 ------------------------------------------------------------------ ...
- BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法
BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...
- bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...
- BZOJ 1875 【SDOI2009】 HH去散步
题目链接:HH去散步 如果不考虑不能走上一次走的边的话,这道题就是一个矩乘的裸题. 现在有了这个条件其实也很好做.我们平常的矩阵都是按点建的,\(A_{i,j}\)表示从第\(i\)个点走到第\(j\ ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
随机推荐
- 数据库操作之Spring JDBCTemplate(postgresql)
本文总结了两种使用JDBCTemplate进行数据库CRUD操作的例子,我用的是pg,废话不说,直接开始吧. 先贴一张目录结果图吧: 上图中最主要的是配置文件和所需的各种jar包. 一.通过属性文件的 ...
- Linux下读写UART串口的代码
Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- //////////////// ...
- git中由readme.md文件引发的问题
在GitHub上建立一个仓库并且添加了readme.txt文件. 无论是push前先将远程仓库pull到本地仓库,还是强制push都会弹出这个问题. Github 禁用了TLS v1.0 and v1 ...
- SourceTree windows免注册免登陆使用方法
问题描述: 安装SourceTree后,首次使用时,需要登录账号:但我们在注册或登录时,可能根本无法打开网页,导致不能进入. 如下截图: 解决方法: 在目录C:\Users\XXXXX\AppData ...
- mybatis中使用包装对象
在实际的应用中,很多时候我们需要的查询条件都是一个综合的查询条件,因此我们需要对已经存在的实体进行再一次的包装,以方便我们进行查询操作,于是包装对象的作用就很明显了,在这里我举一个简单的例子 1.首先 ...
- twisted(转)
reactor.protocol 这两个类都在 twisted.internet 命名空间中 reactor对象是Twisted编程当中的第一步,它就是一个反应器,专门负责与服务端的连接以及监听与服务 ...
- SQLSERVER 根据传入的参数拼接sql语句字符串,反馈结果集
ALTER PROCEDURE [dbo].[usp_visit_detail](@siteid BIGINT, @Startime VARCHAR(15), @Endtime VARCHAR(15 ...
- java 日期合法
try { String date_str = "5555-22-33"; SimpleDateFormat format=new SimpleDateFormat("y ...
- 【JZOJ4810】【NOIP2016提高A组五校联考1】道路规划
题目描述 输入 输出 样例输入 5 1 4 5 2 3 3 4 2 1 5 样例输出 3 数据范围 样例解释 解法 模型显然. 设第一列为a[],第二列为b[],f[i]为前i个数的最大答案. 顺序枚 ...
- Spark day02
Standalone模式两种提交任务方式 Standalone-client提交任务方式 提交命令 ./spark-submit --master spark://node1:7077 --class ...