码迷,mamicode.com
首页 > 其他好文 > 详细

UESTC 915 方老师的分身II --最短路变形

时间:2014-06-15 12:09:25      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   code   http   tar   

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

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

代码:

bubuko.com,布布扣
#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\n",res);
    }
    return 0;
}
View Code

 

UESTC 915 方老师的分身II --最短路变形,布布扣,bubuko.com

UESTC 915 方老师的分身II --最短路变形

标签:style   class   blog   code   http   tar   

原文地址:http://www.cnblogs.com/whatbeg/p/3765634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!