zoukankan      html  css  js  c++  java
  • POJ 1724 ROADS(二维SPFA)

    题目链接

    用STL实现超时了,用普通队列500+,看到spfa,反应太迟钝了。

     1 #include <cstring>
     2 #include <cstdio>
     3 #include <string>
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <vector>
     7 #include <queue>
     8 using namespace std;
     9 #define INF 0x7fffffff
    10 int d[101][10001];
    11 int first[101];
    12 bool in[101][10001];
    13 int q1[10000001];
    14 int q2[10000001];
    15 int t,k,n;
    16 struct node
    17 {
    18     int u,v,w,next,c;
    19 }edge[10001];
    20 void CL()
    21 {
    22     t = 1;
    23     memset(first,-1,sizeof(first));
    24 }
    25 void add(int u,int v,int w,int c)
    26 {
    27     edge[t].u = u;
    28     edge[t].v = v;
    29     edge[t].w = w;
    30     edge[t].c = c;
    31     edge[t].next = first[u];
    32     first[u] = t ++;
    33 }
    34 int spfa(int str,int end)
    35 {
    36     int x,y,v,i,j,ans,l,r;
    37 
    38     for(i = 1;i <= end;i ++)
    39     {
    40         for(j = 0;j <= k;j ++)
    41         {
    42             in[i][j] = 0;
    43             d[i][j] = INF;
    44         }
    45     }
    46     l = r = 1;
    47     q1[1] = str;
    48     q2[1] = 0;
    49     in[str][0] = 1;
    50     d[str][0] = 0;
    51     while(l <= r)
    52     {
    53         x = q1[l];
    54         y = q2[l];
    55         l ++;
    56         in[x][y] = 0;
    57         for(i = first[x];i != -1;i = edge[i].next)
    58         {
    59             v = edge[i].v;
    60             if(y + edge[i].c <= k)
    61             {
    62                 if(d[v][y+edge[i].c] > d[x][y] + edge[i].w)
    63                 {
    64                     d[v][y+edge[i].c] = d[x][y] + edge[i].w;
    65                     if(!in[v][y+edge[i].c])
    66                     {
    67                         r ++;
    68                         q1[r] = v;
    69                         q2[r] = y+edge[i].c;
    70                         in[v][y+edge[i].c] = 1;
    71                     }
    72                 }
    73             }
    74         }
    75     }
    76     ans = INF;
    77     for(i = 0;i <= k;i ++)
    78     {
    79         ans = min(ans,d[end][i]);
    80     }
    81     return ans;
    82 }
    83 int main()
    84 {
    85     int m,sv,ev,w,c,ans,i;
    86     scanf("%d%d%d",&k,&n,&m);
    87     CL();
    88     for(i = 1;i <= m;i ++)
    89     {
    90         scanf("%d%d%d%d",&sv,&ev,&w,&c);
    91         add(sv,ev,w,c);
    92     }
    93     ans = spfa(1,n);
    94     if(ans == INF)
    95     printf("-1
    ");
    96     else
    97     printf("%d
    ",ans);
    98     return 0;
    99 }
  • 相关阅读:
    AFNetWorking 文件上传 By-H罗
    利用系统APP实现导航---By张秀清
    项目 和 需求文档 -- 吴欧
    键盘弹起及lab时的动态计算高度 --董鑫
    NSSet和NSMutableSet
    内联函数 在ios中的运用 --黄仁斌
    iOS 七大手势之轻拍,长按,旋转手势识别器方法-赵小波
    网络技术之BGP
    [手游项目3]-3-golang
    [手游项目3]-2-git
  • 原文地址:https://www.cnblogs.com/naix-x/p/3175441.html
Copyright © 2011-2022 走看看