zoukankan      html  css  js  c++  java
  • hdu 2680

    心血来潮,用优先队列实现了这个Dijkstra,顺便练练静态链表,不过结果也蛮不错的,在acm steps里面是93msA的,在外面却是109ms,排名很靠前,好开心,不过也郁闷,竟然有人31ms过了,汗...到底是怎么样的一个牛人啊......

    代码如下:
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 using namespace std;
     5 
     6 const int maxn = 20000 + 100;
     7 int n,m,endd;
     8 typedef pair<int,int> pii;
     9 struct node
    10 {
    11     int x,y;
    12     int w;
    13 }p[maxn];
    14 int nextt[maxn];
    15 int first[maxn];
    16 int d[1010];
    17 
    18 void dij()
    19 {
    20     priority_queue<pii,vector<pii>,greater<pii> > q;
    21     memset(d,-1,sizeof(d));
    22     d[0] = 0;
    23     q.push(make_pair(d[0],0));
    24     while(!q.empty())
    25     {
    26         pii u = q.top();
    27         q.pop();
    28         int x = u.second;
    29         if(u.first != d[x])
    30             continue;
    31 
    32         for(int e = first[x];e != -1;e = nextt[e])
    33         {
    34             if(d[p[e].y] == -1 || d[p[e].y] > d[x] + p[e].w)
    35             {
    36                 d[p[e].y] = d[x] + p[e].w;
    37                 q.push(make_pair(d[p[e].y],p[e].y));
    38             }
    39         }
    40     }
    41     printf("%d\n",d[endd]);
    42 }
    43 int main()
    44 {
    45     while(scanf("%d%d%d",&n,&m,&endd) == 3)
    46     {
    47         memset(first,-1,sizeof(first));
    48         for(int i = 0;i < m;i ++)
    49         {
    50             int a,b,w;
    51             scanf("%d%d%d",&a,&b,&w);
    52             p[i].x = a;
    53             p[i].y = b;
    54             p[i].w = w;
    55             nextt[i] = first[a];
    56             first[a] = i;
    57         }
    58         int aa;
    59         scanf("%d",&aa);
    60         int t;
    61         for(int i = 0;i < aa;i ++)
    62         {
    63             scanf("%d",&t);
    64             p[i + m].x = 0;
    65             p[i + m].y = t;
    66             p[i + m].w = 0;
    67             nextt[i + m] = first[0];
    68             first[0] = i + m;
    69         }
    70         dij();
    71     }
    72 
    73     return 0;
    74 }
  • 相关阅读:
    DataTable 只保留想要的几列
    如何用多个字符串来切分字符串
    用.net 发送邮件
    sqlserver 行列转换
    sql面试题一 学生成绩
    将DataReader转换为DataTable
    C# 如何用多个字符串来切分字符串并去除空格
    SqlServer按时间自动生成生成单据编号
    实验一 Java开发环境的熟悉
    Java学习笔记心得——初识Java
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2479537.html
Copyright © 2011-2022 走看看