首页 > 代码库 > hdu 1688 Sightseeing

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\n",path[f][1]+path[f][2]);
116         }
117         else
118             printf("%d\n",path[f][1]);
119     }
120     return 0;
121 }
View Code