• hdu4396More lumber is required(二维SPFA)(多校10)


    http://acm.hdu.edu.cn/showproblem.php?pid=4396

    二维最短路 以这个点和到这个点的路径数作为一个点来标记

    View Code
     1 #include <iostream>
     2 #include<cstdio>
     3 #include<string.h>
     4 #include<queue>
     5 #define INF 0xfffffff
     6 using namespace std;
     7 struct node
     8 {
     9     int v,w,next;
    10 }men[200011];
    11 struct mode
    12 {
    13     int v,num;
    14 };
    15 int first[5011],f[5011][511],s,t,k,p[5011][511];
    16 void init()
    17 {
    18     t = 0;
    19     memset(first,-1,sizeof(first));
    20 }
    21 void add(int u,int v,int w)
    22 {
    23     men[t].v = v;
    24     men[t].w = w;
    25     men[t].next = first[u];
    26     first[u] = t;
    27     t++;
    28 }
    29 void spfa(int n)
    30 {
    31     int i,j,v,num;
    32     memset(f,0,sizeof(f));
    33     for(i = 1; i<= n ; i++)
    34     {
    35         for(j = 0 ; j <= k ; j++)
    36          p[i][j] = INF;
    37     }
    38     queue<mode>qq;
    39     mode kk;
    40     kk.v = s;
    41     kk.num = 0;
    42     f[s][0] = 1;
    43     qq.push(kk);
    44     p[s][0] = 0;
    45     while(!qq.empty())
    46     {
    47         mode tt = qq.front();
    48         v = tt.v;
    49         num = tt.num;
    50         f[v][num] = 0;
    51         qq.pop();
    52         for(i = first[v] ; i!=-1 ; i = men[i].next)
    53         {
    54             int tv = men[i].v;
    55             int tw = men[i].w;
    56             num = tt.num+10;
    57             if(num>=k)
    58             num = k;
    59             if(p[tv][num]>p[v][tt.num]+tw)
    60             {
    61                 p[tv][num] = p[v][tt.num]+tw;
    62                 if(!f[tv][num])
    63                 {
    64                     mode tk;
    65                     tk.v = tv;
    66                     tk.num = num;
    67                     qq.push(tk);
    68                     f[tv][num] = 1;
    69                 }
    70             }
    71         }
    72     }
    73 }
    74 int main()
    75 {
    76     int i,j,n,m,u,v,w;
    77     while(scanf("%d%d", &n,&m)!=EOF)
    78     {
    79         init();
    80         for(i = 1; i <= m ;i++)
    81         {
    82             scanf("%d%d%d",&u,&v,&w);
    83             add(u,v,w);
    84             add(v,u,w);
    85         }
    86         scanf("%d%d%d",&s,&t,&k);
    87         spfa(n);
    88         if(p[t][k]==INF)
    89         printf("-1\n");
    90         else
    91         printf("%d\n",p[t][k]);
    92     }
    93     return 0;
    94 }
  • 相关阅读:
    实验-继承&super.doc
    Python库
    Github高级搜索
    代码报错记录
    编程问题解决
    百科
    【Android】添加依赖包
    【Android】导航栏(加图片icon)和不同页面的实现(viewpager+tablayout)
    【Android】Android Studio真机调试的问题统整
    【AD】自己画板的备忘
  • 原文地址:https://www.cnblogs.com/shangyu/p/2656877.html
Copyright © 2020-2023  润新知