zoukankan      html  css  js  c++  java
  • 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接:

      http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808

    题目大意:

      N个点M条无向边(N,M<=105),每条边属于某一条地铁Ci(Ci<=109),每条边有一个耗时,如果乘Ci号线地铁到达一个节点换乘Cj号线地铁离开,还需要花费|Ci-Cj|时间。

      求1到n的最小花费时间。

    题目思路:

      【最短路】【STL】

      d[u][Ci]表示从1到u,最后一条地铁是Ci号线的最小耗时。按照边做,每条边枚举上一个是从哪一条地铁坐过来的,更新答案。最终统计到达n时最后是哪一号线地铁。

      由于Ci很大,需要开STL的set存下到每个点可能的地铁号线,map存d[u][Ci]。

      1 //
      2 //by coolxxx
      3 //#include<bits/stdc++.h>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<map>
      9 #include<stack>
     10 #include<queue>
     11 #include<set>
     12 #include<bitset>
     13 #include<memory.h>
     14 #include<time.h>
     15 #include<stdio.h>
     16 #include<stdlib.h>
     17 #include<string.h>
     18 //#include<stdbool.h>
     19 #include<math.h>
     20 #define min(a,b) ((a)<(b)?(a):(b))
     21 #define max(a,b) ((a)>(b)?(a):(b))
     22 #define abs(a) ((a)>0?(a):(-(a)))
     23 #define lowbit(a) (a&(-a))
     24 #define sqr(a) ((a)*(a))
     25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     26 #define mem(a,b) memset(a,b,sizeof(a))
     27 #define eps (1e-8)
     28 #define J 10000
     29 #define mod 1000000007 
     30 #define MAX 0x7f7f7f7f
     31 #define PI 3.14159265358979323
     32 #define N 100004
     33 #define M 200004
     34 using namespace std;
     35 typedef long long LL;
     36 int cas,cass;
     37 int n,m,lll,ans;
     38 int last[N],q[N];
     39 LL aans;
     40 bool u[N];
     41 set<int>c[N];
     42 map<int,LL>d[N];
     43 struct xxx
     44 {
     45     int next,to,dd,co;
     46 }a[M];
     47 void add(int x,int y,int c,int z)
     48 {
     49     a[++lll].to=y;
     50     a[lll].dd=z;
     51     a[lll].co=c;
     52     a[lll].next=last[x];
     53     last[x]=lll;
     54 }
     55 void spfa()
     56 {
     57     int i,j,k,now,to,l=0,r=1;
     58     set<int>::iterator ii;
     59     q[1]=1;
     60     for(ii=c[1].begin();ii!=c[1].end();ii++)d[1][(*ii)]=0;
     61     while(l!=r)
     62     {
     63         now=q[l=(l+1)%N];
     64         if(now==n)continue;
     65         u[now]=0;
     66         for(i=last[now];i;i=a[i].next)
     67         {
     68             to=a[i].to;
     69             if(d[to].find(a[i].co)==d[to].end())
     70                 d[to][a[i].co]=MAX;
     71             for(ii=c[now].begin();ii!=c[now].end();ii++)
     72             {
     73                 if(d[now].find((*ii))==d[now].end())continue;
     74                 if(d[now][(*ii)]+a[i].dd+abs((*ii)-a[i].co)>aans)continue;
     75                 if(d[now][(*ii)]+a[i].dd+abs((*ii)-a[i].co)<d[to][a[i].co])
     76                 {
     77                     d[to][a[i].co]=d[now][(*ii)]+a[i].dd+abs((*ii)-a[i].co);
     78                     if(to==n)
     79                     {
     80                         aans=min(aans,d[to][a[i].co]);
     81                         continue;
     82                     }
     83                     if(!u[to])
     84                     {
     85                         u[to]=1;
     86                         q[r=(r+1)%N]=to;
     87                     }
     88                 }
     89             }
     90         }
     91     }
     92 }
     93 int main()
     94 {
     95     #ifndef ONLINE_JUDGE
     96 //    freopen("1.txt","r",stdin);
     97 //    freopen("2.txt","w",stdout);
     98     #endif
     99     int i,j,k;
    100     int x,y,z;
    101 //    for(scanf("%d",&cass);cass;cass--)
    102 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
    103 //    while(~scanf("%s",s+1))
    104     while(~scanf("%d",&n))
    105     {
    106         for(i=1;i<=n;i++)
    107         {
    108             c[i].clear();
    109             d[i].clear();
    110         }
    111         mem(last,0);mem(u,0);lll=0;
    112         scanf("%d",&m);
    113         for(i=1;i<=m;i++)
    114         {
    115             scanf("%d%d%d%d",&x,&y,&j,&z);
    116             add(x,y,j,z);
    117             add(y,x,j,z);
    118             c[x].insert(j);c[y].insert(j);
    119         }
    120         aans=100000000000000;
    121         spfa();
    122         printf("%lld
    ",aans);
    123     }
    124     return 0;
    125 }
    126 /*
    127 //
    128 
    129 //
    130 */
    View Code
  • 相关阅读:
    window7环境下VMWare自定义安装Linux虚拟机完全教程
    Extjs的GridPanel分页前后台完整代码实例
    python数据持久存储:pickle模块的基本使用
    一个 11 行 Python 代码实现的神经网络
    Hadoop入门实例——WordCount统计单词
    Linux环境搭建Hadoop伪分布模式
    函数
    循环
    docker环境下gitlab配置ci
    docker部署mysql配置过程记录
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5842561.html
Copyright © 2011-2022 走看看