zoukankan      html  css  js  c++  java
  • 第K最短路问题

    第一行包含两个整数N和M(1 <= N <= 1000,0 <= M <= 100000)。 站的编号从1到N.接下来M行中的每一行包含三个整数A,B和T(1 <= A,B <= N,1 <= T <= 100)。 代表顶点A到B的边权值为T。
    最后一行由三个整数S,T和K组成(1 <= S,T <= N,1 <= K <= 1000)。

    第K个最短路径的值, 如果不存在第K个最短路径,则应输出-1。

    2 2
    1 2 5
    2 1 4
    1 2 2


    14
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ans[1011],S,T,K;int tu[1011];
    bool shuchu=0;
    vector<int>b[1011],zhi[1011],c[1011],zhic[1011];
    bool cha[1001];queue<int>q;
    void pan()
    {
        for(int i=1;i<=n;i++)
        {
             
            tu[i]=100000000;
        }
        tu[T]=0;
        q.push(T);
        while(q.empty()==0)
        {
            int u=q.front();q.pop(),cha[u]=0;
            for(int i=0;i<c[u].size();i++)
            {
                if(tu[c[u][i]]>tu[u]+zhic[u][i])
                {
                    tu[c[u][i]]=tu[u]+zhic[u][i];
                    if(!cha[c[u][i]])
                    {
                        cha[u]=1;q.push(c[u][i]);
                    }
                }
            }
        }
        return;
    }
    struct node
    {
        int d,zhi;
         
    }k,ji;
    priority_queue<node> a;
    bool operator <(const node &a,const node &b){
        return a.zhi+tu[a.d]>b.zhi+tu[b.d];
    }
    void bfs()
    {
        if(S==T)
            K++;
        a.push((node){S,0});
        while(a.empty()==0)
        {
            k=a.top();a.pop();
            ans[k.d]++;
            if(ans[T]==K)
            {
                cout<<k.zhi;
                shuchu=1;
                return;
            }
            if(ans[k.d]>K)
                continue;
            for(int i=0;i<b[k.d].size();i++)
                a.push((node){b[k.d][i],k.zhi+zhi[k.d][i]});
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        int x,y,z;
        while(m--)
        {
            scanf("%d%d%d",&x,&y,&z);
            b[x].push_back(y);
            zhi[x].push_back(z);
            c[y].push_back(x);
            zhic[y].push_back(z);
        }
        scanf("%d%d%d",&S,&T,&K);
        pan();
        bfs();
        if(shuchu==0)
        {
            printf("%d",-1);
        }
        return 0;
    }
    用tu【】记录当前点到终点最短距离,bfs函数搜索中,每个点被搜索的次数都小于K(spfa打错了,调试了好几天)
  • 相关阅读:
    md测试
    安利好用的小工具及软件(常更新)
    08-无人值守自动批量安装系统(下)
    建立本地yum仓库
    如何知道命令是由哪个服务提供的
    08-无人值守自动批量安装系统(上)
    07-软件管理
    06-时间管理
    05-用户和组以及权限
    04-编辑文本
  • 原文地址:https://www.cnblogs.com/fanhao050109/p/11047236.html
Copyright © 2011-2022 走看看