zoukankan      html  css  js  c++  java
  • uva 11374(Dijkstra) HappyNewYear!!!

    2013年最后一题,也是最后一篇随笔~祝大家新年快乐!

    题意:在一张无向图中, 有两种公交线路,快线和慢线。现在有一个人想要从s->e但是他只有一张快线车票。所以快线只能乘坐一次,慢线可以随便乘坐,让你求从s->e的最短路。

    思路:这道题是liurujia书上的一题。没有按照他的方法做直接暴力出来了。方法就是每次向图中加一条边,然后对其求最短路,判断能不能更新当前最优值,可以的话把路径和答案记录下来即可。最后递归输出。

    代码如下:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <cmath>
      6 #include <algorithm>
      7 #include <queue>
      8 #include <stack>
      9 #include <vector>
     10 #define PB(a) push_back(a)
     11 #define MP(a, b) make_pair(a, b)
     12 
     13 using namespace std;
     14 
     15 typedef long long ll;
     16 typedef pair<int, int> pii;
     17 
     18 const int INF = 0x3f3f3f3f;
     19 const double eps = 1e-6;
     20 const int LEN = 1010;
     21 
     22 vector<pii> Map[LEN];
     23 int n, m, K, dis[LEN], pre[LEN], apre[LEN], stans, e;
     24 
     25 void Dijkstra(int s)
     26 {
     27     priority_queue<pii, vector<pii>, greater<pii> > q;
     28     int vis[LEN] = {0};
     29     for(int i=1; i<=n; i++)dis[i] = INF;
     30     dis[s] = 0;
     31     q.push(MP(dis[s], s));
     32     while(!q.empty()){
     33         pii nvex = q.top(); q.pop();
     34         int nv = nvex.second;
     35         if(vis[nv])continue;
     36         vis[nv] = 1;
     37         for(int i=0; i<Map[nv].size(); i++){
     38             int x = Map[nv][i].first, y = Map[nv][i].second;
     39             if(dis[x]>dis[nv]+y){
     40                 dis[x] = dis[nv]+y;
     41                 pre[x] = nv;
     42                 q.push(MP(dis[x], x));
     43             }
     44         }
     45     }
     46 }
     47 
     48 void Upans(int &ans, int pos){
     49     if(dis[e]>=ans)return ;
     50     ans = dis[e];
     51     stans = pos;
     52     for(int i=1; i<=n; i++)apre[i] = pre[i];
     53 }
     54 
     55 void outans(int vex, int s){
     56     if(vex==s)printf("%d", vex);
     57     else if(dis[vex]==0)return ;
     58     else{
     59         outans(apre[vex], s);
     60         printf(" %d", vex);
     61     }
     62 }
     63 
     64 int main()
     65 {
     66 //    freopen("in.txt", "r", stdin);
     67 
     68     int a, b, c, s;
     69     for(int kase=0; scanf("%d%d%d", &n, &s, &e)!=EOF ;kase++){
     70         memset(apre, 0 ,sizeof apre);
     71         if(kase)printf("
    ");
     72         for(int i=0; i<=n; i++)Map[i].clear();
     73         scanf("%d", &m);
     74         for(int i=0; i<m; i++){
     75             scanf("%d%d%d", &a, &b, &c);
     76             Map[a].PB(MP(b,c));
     77             Map[b].PB(MP(a,c));
     78         }
     79         scanf("%d", &K);
     80         Dijkstra(s);
     81         int ans = dis[e]; stans = -1;
     82         for(int i=1; i<=n; i++)apre[i] = pre[i];
     83         for(int i=0; i<K; i++){
     84             scanf("%d%d%d", &a, &b, &c);
     85             Map[a].PB(MP(b, c));
     86             Dijkstra(s);
     87             Upans(ans, a);
     88             Map[a].pop_back();
     89             Map[b].PB(MP(a, c));
     90             Dijkstra(s);
     91             Upans(ans, b);
     92             Map[b].pop_back();
     93         }
     94 
     95         outans(e, s);printf("
    ");
     96         if(stans==-1)printf("Ticket Not Used
    ");
     97         else printf("%d
    ", stans);
     98         printf("%d
    ", ans);
     99     }
    100     return 0;
    101 }
    View Code
    奔跑吧!少年!趁着你还年轻
  • 相关阅读:
    052_from表单的两种请求方式
    051_ajax的两种请求方式与传递流
    050_SpringMVC配置文件解析器
    049_文件下载为什么只能使用同步请求?
    048_io流
    048_get与url的编码问题
    062_什么是http协议?什么又是三次握手?
    020_全选功能无法出现统一协调时
    064_js中function怎么才能有返回值呢?
    Kali单用户模式下重置登录口令教程
  • 原文地址:https://www.cnblogs.com/shu-xiaohao/p/3500168.html
Copyright © 2011-2022 走看看