zoukankan      html  css  js  c++  java
  • hdu 4396(spfs/二维最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4396

    思路:dist[i][j]表示到顶点i走了k条路所花费的最小时间,为了节省内存,当j>=k时,直接令j=k即可,然后就是二维spfa求最短路了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<vector>
     7 using namespace std;
     8 #define MAXN 5555
     9 #define inf 1<<30
    10 struct Node{
    11    int v,w;
    12 };
    13 vector<Node>map[MAXN];
    14 typedef pair<int,int>Pair;
    15 
    16 int dist[MAXN][55];//表示到i点经过j条路的最小花费
    17 bool mark[MAXN][55];
    18 int n,m,st,ed,k;
    19 
    20 void spfa(){
    21    for(int i=0;i<=n;i++)
    22       for(int j=0;j<55;j++)
    23          dist[i][j]=inf;
    24    memset(mark,false,sizeof(mark));
    25    mark[st][0]=true;
    26    dist[st][0]=0;
    27    queue<Pair>Q;
    28    Q.push(make_pair(st,0));
    29    while(!Q.empty()){
    30       Pair pp=Q.front();
    31       Q.pop();
    32       int u=pp.first;
    33       int step=pp.second;
    34       mark[u][step]=false;
    35       for(int i=0;i<map[u].size();i++){
    36          int v=map[u][i].v;
    37          int w=map[u][i].w;
    38          int nstep=step+1;
    39          if(nstep>k)nstep=k;
    40          if(dist[v][nstep]>dist[u][step]+w){
    41             dist[v][nstep]=dist[u][step]+w;
    42             if(!mark[v][nstep]){ mark[v][nstep]=true;Q.push(make_pair(v,nstep)); }
    43          }
    44       }
    45    }
    46 }
    47 
    48 int main(){
    49    int u,v,w;
    50    while(~scanf("%d%d",&n,&m)){
    51       for(int i=0;i<=n;i++)map[i].clear();
    52       for(int i=1;i<=m;i++){
    53          scanf("%d%d%d",&u,&v,&w);
    54          Node p1,p2;
    55          p1.v=v,p1.w=w;
    56          p2.v=u,p2.w=w;
    57          map[u].push_back(p1);
    58          map[v].push_back(p2);
    59       }
    60       scanf("%d%d%d",&st,&ed,&k);
    61       k=k/10+(k%10!=0);
    62       spfa();
    63       if(dist[ed][k]!=inf){
    64          printf("%d\n",dist[ed][k]);
    65       }else
    66          puts("-1");
    67    }
    68    return 0;
    69 }
    View Code
  • 相关阅读:
    [VirtaulBox]网络连接设置
    LeetCode
    LeetCode
    LeetCode
    LeetCode-37.Sudok Solver
    LeetCode-36.Valid Sudoku
    LeetCode-52.N-Queen II
    LeetCode-51.N-Queens
    LeetCode-22.Generate Parentheses
    LeetCode-111.Mininum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/wally/p/3108380.html
Copyright © 2011-2022 走看看