DP+最短路

两遍最短路判零环

DP转移f[i][j] 到点i的距离比最短路多j时的方案数

 #include<bits/stdc++.h>
using namespace std;
const int N=;
struct node
{
    int to,nex,w;
}e[N],z[N];
int cnt,cnt1,head[],head2[];
int add(int x,int y,int w)
{
    e[++cnt1].to=y;e[cnt1].w=w;e[cnt1].nex=head[x];head[x]=cnt1;
    z[++cnt].to=x;z[cnt].w=w;z[cnt].nex=head2[y];head2[y]=cnt;
}
int f[][];
int d1[],d2[],d[],qq[N<<];
bool v[];int n,m,k,p;
void update(int &a,int b)
{
    a=(a+b)%p;
}
queue<int>q;
void work()
{
    scanf("%d%d%d%d",&n,&m,&k,&p);cnt=,cnt1=;
    memset(head,,sizeof(head));
    memset(head2,,sizeof(head2));
    for(int i=;i<=m;++i)
    {
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        add(x,y,w);
    }
    memset(v,,sizeof(v));memset(d1,0x3f,sizeof(d1));
    q.push();d1[]=;v[]=;
    while(!q.empty())
    {
        int x=q.front();q.pop();v[x]=;
        for(int i=head[x];i;i=e[i].nex)
        {
            int y=e[i].to;
            if(d1[y]>d1[x]+e[i].w)
            {
                d1[y]=d1[x]+e[i].w;
                if(!v[y])
                {
                    q.push(y);v[y]=;
                }
            }
        }
    }
    memset(v,,sizeof(v));memset(d2,0x3f,sizeof(d2));
    q.push(n);d2[n]=;v[n]=;
    while(!q.empty())
    {
        int x=q.front();q.pop();v[x]=;
        for(int i=head2[x];i;i=z[i].nex)
        {
            int y=z[i].to;
            if(d2[y]>d2[x]+z[i].w)
            {
                d2[y]=d2[x]+z[i].w;
                if(!v[y])
                {
                    q.push(y);v[y]=;
                }
            }
        }
    }
   
    int top=;memset(d,,sizeof(d));
    for(int i=;i<=n;++i)
    for(int j=head[i];j;j=e[j].nex)
    {
        if(d1[i]+e[j].w==d1[e[j].to])d[e[j].to]++;
    }
    for(int i=;i<=n;++i)if(!d[i])qq[++top]=i;
    for(int i=;i<=top;++i)
    {
        int x=qq[i];
        for(int j=head[x];j;j=e[j].nex)
        if(d1[x]+e[j].w==d1[e[j].to])
        {
            int y=e[j].to;
            d[y]--;
            if(d[y]==)qq[++top]=y;
        }
    }
    for(int i=;i<=n;++i)
    if(d[i]&&d1[i]+d2[i]<=d1[n]+k)
    {
        puts("-1");return;
    }
    int ans=;
    memset(f,,sizeof(f));
    f[][]=;
    for(int i=;i<=k;++i)
    {
        for(int j=;j<=top;++j)
        for(int u=head[qq[j]];u;u=e[u].nex)
        {
            if(d1[qq[j]]+e[u].w==d1[e[u].to])
            update(f[e[u].to][i],f[qq[j]][i]);
        }
       
        for(int j=;j<=n;++j)
        for(int u=head[j];u;u=e[u].nex)
        {
            if(d1[j]+e[u].w!=d1[e[u].to]&&i+d1[j]-d1[e[u].to]+e[u].w<=k)
            update(f[e[u].to][i+d1[j]-d1[e[u].to]+e[u].w],f[j][i]);
        }
    }
    for(int i=;i<=k;++i)
    update(ans,f[n][i]);
    printf("%d\n",ans);
    return ;
}
int main()
{
    int t;scanf("%d",&t);
    while(t--)
    {
        work();
    }
    return ;
}

NOIP2017 D1T3逛公园的更多相关文章

  1. [luogu P3953] [noip2017 d1t3] 逛公园

    [luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...

  2. NOIP2017 D1T3 逛公园

    发现 \(K\) 很小,不妨设置一个 \(O(NK)\) 的 \(DP\). 发现可行的最短路必须满足是 \(d <= dis <= d + K\). 由逆向思维,则是从某点出发,可以消耗 ...

  3. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  4. 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)

    题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...

  5. NOIP2017:逛公园

    Sol 发现\(NOIP2017\)还没\(AK\)??? 赶紧改 考场上明明打出了\(DP\),没时间了,没判环,重点是没初始化数组,爆\(0\) \(TAT\) 先最短路,然后\(f[i][j]\ ...

  6. 【NOIP2017】逛公园 最短路+DP

    诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...

  7. LOJ2316. 「NOIP2017」逛公园【DP】【最短路】【思维】

    LINK 思路 因为我想到的根本不是网上的普遍做法 所以常数出奇的大,而且做法极其暴力 可以形容是带优化的大模拟 进入正题: 首先一个很显然的思路是如果在合法的路径网络里面存在零环是有无数组解的 然后 ...

  8. 【NOIP2017】逛公园 D1 T3

    记忆化搜索 跑一次反向的最短路求出MinDis(u,n)MinDis(u,n)MinDis(u,n) f[u][k]f[u][k]f[u][k]表示dis(u,n)<=MinDis(u,n)+d ...

  9. 【LOJ2316】「NOIP2017」逛公园

    [题目链接] [点击打开链接] [题目概括] 对给定\(K\),起点\(1\)到终点\(n\)中对长度为\([L,L+K]\)的路径计数. \(L\)为\(1\)到\(n\)的最短路长度. [思路要点 ...

随机推荐

  1. 应用于网站导航中的 12 个 jQuery 插件

    当考虑到网页设计时,导航被认为是使网页以用户友好方式展现的一个重要部分.在现代的交互网站中,导航起着至关重要的作用,如果没有正确地处理会影响你网站的访问.适当的导航工具能够帮助用户在网站的不同页面内容 ...

  2. 【BZOJ】2331: [SCOI2011]地板 插头DP

    [题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...

  3. Docker 配置国内镜像拉取中心,Configure docker to use faster registries in China.

    Networking in China is really bad when it comes to using some cloud based tools like docker, it's us ...

  4. 从ZoomEye API 到 Weblogic 弱口令扫描

    参考资料: ZoomEye API: https://www.zoomeye.org/api/doc Weblogic-Weakpassword-Scnner: https://github.com/ ...

  5. Warning: Permanently added the RSA host key for IP address '192.30.253.113' to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure y

    这个应该是很多github新手经常出错的问题,这个就是没有在你github上添加一个公钥. 下面就直接说步骤: 1 可以用 ssh -T git@github.com去测试一下 图上可以明显看出缺少了 ...

  6. glom模块的使用(二)

    上次我们说到golm的简单应用这次我们继续带结构化数据的其他操作进行学习. Literal 用法:class glom.Literal(value) 这个方法的功能主要是添加自定义的键值. 例如: f ...

  7. ssh连接不上排查方法总结

    //常见报错信息 # No route to host --> server端没有开机或是网络不通(这个原因很多,最简单的是网线没有插.还有就是可能会是网卡down了等) 如果是网卡down了i ...

  8. python RSA加密解密及模拟登录cnblog

    1.公开密钥加密 又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥.公钥加密的只能私钥解密,用于加密客户上传数据.私钥加密的数据,公钥可以解密,主要用于数字签名.详细介绍可参见维基百科 ...

  9. mysql 创建数据库的时候选择 utf8 bin 和 utf8 ci的区别

    utf8 ci  不区分大小写: utf8 bin 区分大小写:

  10. Zabbix定义报警机制

    1. 修改zabbix配置文件 #取消注释或添加一行 cat -n /etc/zabbix/zabbix_server.conf |grep --color=auto "AlertScrip ...