首页 > 其他分享 >853. 有边数限制的最短路

853. 有边数限制的最短路

时间:2023-10-01 21:57:41浏览次数:28  
标签:cnt 853 int 短路 vis edge 边数 include dis

第一版 err

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#define N 505
using namespace std;
int n,m,k,dis[N],cnt,hd[N],vis[N],x,y,z;
struct Edge{
    int to, nxt, w;
}edge[10005];
struct Node{
    int c,d;
}node[N];
queue<Node> q;
void add(int u, int v, int w){
    edge[++cnt].to = v;
    edge[cnt].nxt = hd[u];
    edge[cnt].w = w;
    hd[u] = cnt;
}
void spfa(){//
    q.push((Node){1,0}); dis[1] = 0;  vis[1] = 1;
    while(!q.empty()){
        Node t = q.front(); q.pop();
        int u = t.c; vis[u] = 0;
        if(t.d == k) return;
        for(int i = hd[u]; i; i = edge[i].nxt){
            int v = edge[i].to;
            if(dis[u] + edge[i].w < dis[v]){
                dis[v] = dis[u] + edge[i].w;
                if(!vis[v]){
                    vis[v] = 1;
                    q.push((Node){v, t.d+1});
                }
            }
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1; i <= m; i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
    }
    memset(dis, 0x3f, sizeof dis);
    spfa();
    if(dis[n] >= 0x3f3f3f3f/2) printf("impossible\n");
    else printf("%d\n",dis[n]);
    return 0;
}
/*
1-2-3-4
\   |
5   |
 \ /
  6
入队: 1 5 2 6 3 (6出队的时候,将3更新,但3已经在队中,那么3到底是第3层还是第4层,3出队的时候如何更新4?)
*/
bellman-ford过程第三遍更新时,3会被更新,4也会被更新,这样4相当于是1-5-6-3-4,而不是1-2-3-4

第二版

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#define N 505
using namespace std;
int n,m,k,dis[N][10005],cnt,hd[N],vis[N][10005],x,y,z;
struct Edge{
    int to, nxt, w;
}edge[10005];
struct Node{
    int c,d;
}node[N];
queue<Node> q;
void add(int u, int v, int w){
    edge[++cnt].to = v;
    edge[cnt].nxt = hd[u];
    edge[cnt].w = w;
    hd[u] = cnt;
}
void spfa(){//
    q.push((Node){1,0}); dis[1][0] = 0;  vis[1][0] = 1;
    while(!q.empty()){
        Node t = q.front(); q.pop();
        int u = t.c; int p = t.d;
        vis[u][p] = 0;
        if(p == k) return;
        for(int i = hd[u]; i; i = edge[i].nxt){
            int v = edge[i].to;
            if(dis[u][p] + edge[i].w < dis[v][p+1]){
                dis[v][p+1] = dis[u][p] + edge[i].w;
                if(!vis[v][p+1 ]){
                    vis[v][p+1] = 1;
                    q.push((Node){v, p+1});
                }
            }
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1; i <= m; i++){
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
    }
    memset(dis, 0x3f, sizeof dis);
    spfa();
    int ans = 0x3f3f3f3f;
    for(int i = 0; i <= k; i++){
        ans = min(ans, dis[n][i]);
    }
    if(ans > 0x3f3f3f3f/2) cout<<"impossible"<<endl;
    else cout<<ans<<endl;
    return 0;
}
/*
1-2-3-4
\   |
5   |
 \ /
  6
入队: 1 5 2 6 3 (6出队的时候,将3更新,但3已经在队中,那么3到底是第3层还是第4层,3出队的时候如何更新4?)
*/

 

标签:cnt,853,int,短路,vis,edge,边数,include,dis
From: https://www.cnblogs.com/caterpillor/p/17739325.html

相关文章

  • 单源最短路模板
    SPFA#include<bits/stdc++.h>#definerintregisterint#defineendl'\n'usingnamespacestd;constintN=1e5+5;constintM=1e6+5;constintinf=1e9;inth[N],e[M],ne[M],dist[N],w[M];intn,m,s,idx;queue<int>......
  • [算法分析与设计] 1. 全源最短路近似
    全源最短路(APSP)近似。有两种近似stretch\(k\).\(\delta(u,v)\leqd(u,v)\leqk\cdot\delta(u,v)\).surplus\(t\).\(\delta(u,v)\leqd(u,v)\leq\delta(u,v)+t\).其中,\(\delta(u,v)\)表示\(u,v\)间真实的最短路长度。先来考虑无权图上的surplus......
  • 最短路与次短路
    最短路算法不再赘述,假定我们已经求出了最短路,记\(f[x,y]\)为\(x\)到\(y\)的最短路。记\(g[x,y]\)为\(x\)到\(y\)的严格次短路。最短路树的定义单源最短路问题中,如果p1->p2->p3->...pn是一条最短路,就将它的边都加入图中。将所有的最短路径都这样处理,得到的图就......
  • P7916 [CSP-S 2021] 交通规划 sol-最短路+环形dp
    P7916[CSP-S2021]交通规划solStatement传送门Solution好题。发现\(k\le2\)的分值非常多,于是我们考虑从\(k=2\)入手。颜色相同就不用说了,直接染成同一种颜色就行了。我们考虑其他情况,就是颜色不相同的情况,我们一定是找了一条路径把这个图给切开了就像这个样子。......
  • 最短路基础实现方法模板合集
    $\color{#39c588}{关于最短路}$$\color{purple}{首先是最短路的算法选择思路捏,直接来个Y总的图}$++$\color{purple}{单源汇问题}$++$\color{orange}{朴素版Dijkstra}$实现思路//朴素版Dijkstrao(n^2)--处理稠密图--稠密图用邻接矩阵存储//1.初始化邻接......
  • VC6.0编译器中混有.c文件时出现fatal error C1853错误解决办法及extern "C"说明
    第一章的sample1,文中提到由于windows底层代码基本上是用c语言编写的,因此新工程里的CPP文件要改为C文件。但是在编译时出现错误fatalerrorC1853:"debug/1_1.pch"isnotaprecompliedheaderfilewiththiscomplier......这个问题还真是头一次遇到,怎么办?百度一下,解决办法......
  • MTK6853/MT6853天玑720安卓核心板安兔兔跑分_MTK5G方案定制
    MT6853(天玑720)核心板采用了7nm制程,并集成了低功耗的5G调制解调器。它配备了八核CPU,包括两个主频为2GHz的ArmCortex-A76大核和六个主频为2GHz的Cortex-A55小核。天玑720采用强大的ARMMali-G57MC3GPU,搭载Android11.0操作系统,待机功耗可低至7ma。内置NPU高达1T算力,拥有超强......
  • 同余最短路
    简述:完全背包,但物品质量很大(105左右),空间上第二维开不下,时间上狠狠超时,咋办呐,同余最短路咯(不小心学到的)  先简写f[(i+aj)%m]=min( f[(i+aj)%m],f[i]+aj)类比最短路Dijkstra咋求的d[y]=min(d[y],d[x]+vx,y)sox->i,y->(i+aj)%m,x->y建一条有向边,最......
  • 最短路之Floyd(医院设置)
    题意题目链接:https://www.luogu.com.cn/problem/P1364给一个二叉树,每个结点有一个值,这个值代表这个结点(即城市)有多少人,然后需要在这些结点中选出一个结点作为医院,问选哪个结点得到的距离和最小。距离和为人数乘以路径长度。思路用最短路,就是先求出每两个点之间的最短......
  • 20-布尔值-比较运算符-逻辑运算符-短路问题
            ......