zoukankan      html  css  js  c++  java
  • UESTC 915 方老师的分身II --最短路变形

    即求从起点到终点至少走K条路的最短路径。

    用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大于K条边的当做K条边来处理就好了。求最短路的三个算法都可以做,我这里用的是SPFA,比较简洁。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <queue>
    #define Mod 1000000007
    using namespace std;
    #define N 5007
    
    vector<pair<int,int> > G[N];
    int w[N][57],inq[N][57];
    int s,t,n,m,k,res;
    struct node
    {
        int u,e;
        node(int _u,int _e)
        {
            u = _u;
            e = _e;
        }
        node(){}
    };
    
    void SPFA(int s)
    {
        int u,v,e,i,j,len;
        for(i=0;i<=n;i++)
        {
            for(j=0;j<=50;j++)
            {
                w[i][j] = Mod;
                inq[i][j] = 0;
            }
        }
        queue<node> que;
        res = Mod;
        while(!que.empty())
            que.pop();
        w[s][0] = 0;
        inq[s][0] = 1;
        que.push(node(s,0));
        while(!que.empty())
        {
            node tmp = que.front();
            que.pop();
            u = tmp.u;
            e = tmp.e;
            if(u == t && e == k)
                res = min(w[u][e],res);
            inq[u][e] = 0; //释放
            int ka;
            if(e+1 > k)
                ka = k;
            else
                ka = e+1;
            for(i=0;i<G[u].size();i++)
            {
                v = G[u][i].first;
                len = G[u][i].second;
                if(w[v][ka] > len + w[u][e])
                {
                    w[v][ka] = len + w[u][e];
                    if(!inq[v][ka])
                    {
                        inq[v][ka] = 1;
                        que.push(node(v,ka));
                    }
                }
            }
        }
    }
    
    int main()
    {
        int u,v,wi,i,j;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=0;i<=5000;i++)
                G[i].clear();
            while(m--)
            {
                scanf("%d%d%d",&u,&v,&wi);
                G[u].push_back(make_pair(v,wi));
                G[v].push_back(make_pair(u,wi));
            }
            scanf("%d%d%d",&s,&t,&k);
            SPFA(s);
            if(res == Mod)
                puts("-1");
            else
                printf("%d
    ",res);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    telent

    linux系统下部署war包
    CentOS-7.0.中安装与配置Tomcat-7的方法
    ServletContextListener
    JAVA中静态块、静态变量加载顺序详解
    git 查看父分支
    Google Guice 之绑定1
    STM32 Cubemx 配置定时器定时1mS
    项目过程的几点经验总结
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3765634.html
Copyright © 2011-2022 走看看