zoukankan      html  css  js  c++  java
  • hdu 1688 Sightseeing

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

    这道题就是求最短路路径和次短路路径的条数。 

    用一个二维数组记录每一个节点距离起始点的最短距离和次短距离,再开一个二维数组记录路径数

    更新状态时:

     1)新值小于最短路径长:更新最短路径长,计数;次短路径长,计数

    2)新值等于最短路径长:更新最短路径计数

     3)新值大于最短路径长,小于次短路径长:更新次短路径长,计数

    4)新值等于次短路径长:更新次短路径计数

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <vector>
      4 #include <queue>
      5 #include <algorithm>
      6 #define maxn 2000
      7 using namespace std;
      8 const int inf=1<<30;
      9 struct edge
     10 {
     11     int v,w;
     12 };
     13 
     14 struct node
     15 {
     16     int d,v;
     17     int mark;
     18     bool operator < (const node &a)const
     19     {
     20         if(d!=a.d)
     21             return d>a.d;
     22         return v>a.v;
     23     }
     24 };
     25 
     26 vector<edge>edges[maxn];
     27 int dis[maxn][3];
     28 int vis[maxn][3];
     29 int path[maxn][3];
     30 int n,m,a,b,c,s1,f;
     31 node st;
     32 
     33 
     34 void inti()
     35 {
     36     for(int i=0; i<=n; i++)
     37     {
     38         dis[i][1]=dis[i][2]=inf;
     39     }
     40     memset(path,0,sizeof(path));
     41     memset(vis,false,sizeof(vis));
     42 }
     43 
     44 void dijkstra(int s,int e)
     45 {
     46     inti();
     47     priority_queue<node>q;
     48     dis[s][1]=0;
     49     path[s][1]=1;
     50     memset(vis,false,sizeof(vis));
     51     st.d=0; st.v=s;
     52     st.mark=1;
     53     q.push(st);
     54     while(!q.empty())
     55     {
     56         node st1=q.top(); q.pop();
     57         if(vis[st1.v][st1.mark]) continue;
     58         vis[st1.v][st1.mark]=true;
     59         for(int i=0; i<(int)edges[st1.v].size(); i++)
     60         {
     61              int v1=edges[st1.v][i].v;
     62              int w1=edges[st1.v][i].w;
     63              if(!vis[v1][1]&&st1.d+w1<dis[v1][1])
     64              {
     65                  if(dis[v1][1]!=inf)
     66                  {
     67                      dis[v1][2]=dis[v1][1];
     68                      path[v1][2]=path[v1][1];
     69                      st.d=dis[v1][2]; st.v=v1; st.mark=2;
     70                      q.push(st);
     71                  }
     72                  dis[v1][1]=st1.d+w1;
     73                  path[v1][1]=path[st1.v][st1.mark];
     74                  st.v=v1; st.mark=1; st.d=dis[v1][1];
     75                  q.push(st);
     76              }
     77              else if(!vis[v1][1]&&st1.d+w1==dis[v1][1])
     78              {
     79                  path[v1][1]+=path[st1.v][st1.mark];
     80              }
     81              else if(!vis[v1][2]&&st1.d+w1<dis[v1][2])
     82              {
     83                  dis[v1][2]=st1.d+w1;
     84                  path[v1][2]=path[st1.v][st1.mark];
     85                  st.d=dis[v1][2]; st.v=v1; st.mark=2;
     86                  q.push(st);
     87              }
     88              else if(!vis[v1][2]&&st1.d+w1==dis[v1][2])
     89              {
     90                  path[v1][2]+=path[st1.v][st1.mark];
     91              }
     92         }
     93     }
     94 }
     95 
     96 int main()
     97 {
     98     int t;
     99     scanf("%d",&t);
    100     while(t--)
    101     {
    102         scanf("%d%d",&n,&m);
    103         inti();
    104         for(int i=0; i<=n; i++) edges[i].clear();
    105         for(int i=0; i<m; i++)
    106         {
    107             scanf("%d%d%d",&a,&b,&c);
    108             edge m1; m1.v=b; m1.w=c;
    109             edges[a].push_back(m1);
    110         }
    111         scanf("%d%d",&s1,&f);
    112         dijkstra(s1,f);
    113         if(dis[f][1]+1==dis[f][2])
    114         {
    115             printf("%d
    ",path[f][1]+path[f][2]);
    116         }
    117         else
    118             printf("%d
    ",path[f][1]);
    119     }
    120     return 0;
    121 }
    View Code
  • 相关阅读:
    插入排序
    选择排序
    P1338 末日的传说 逆序数对
    P1582倒水 位运算
    P2158 [SDOI2008] (欧拉函数
    HDU 6274 二分+预处理(CCPC K题
    P1219 N皇后
    [USACO1.5] 回文质数
    Codeforces #123D: 后缀数组+单调栈
    单调栈 单调队列
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3712202.html
Copyright © 2011-2022 走看看