Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 969 Accepted Submission(s): 409
Different groups of tourists may have different preferences for the sights they want to see, and thus for the route to be taken from S to F. Therefore, Your Personal Holiday wants to offer its clients a choice from many different routes. As hotels have been booked in advance, the starting city S and the final city F, though, are fixed. Two routes from S to F are considered different if there is at least one road from a city A to a city B which is part of one route, but not of the other route.
There is a restriction on the routes that the tourists may choose from. To leave enough time for the sightseeing at the stops (and to avoid using too much fuel), the bus has to take a short route from S to F. It has to be either a route with minimal distance, or a route which is one distance unit longer than the minimal distance. Indeed, by allowing routes that are one distance unit longer, the tourists may have more choice than by restricting them to exactly the minimal routes. This enhances the impression of a personal holiday.
For example, for the above road map, there are two minimal routes from S = 1 to F = 5: 1 → 2 → 5 and 1 → 3 → 5, both of length 6. There is one route that is one distance unit longer: 1 → 3 → 4 → 5, of length 7.
Now, given a (partial) road map of the Benelux and two cities S and F, tour operator Your Personal Holiday likes to know how many different routes it can offer to its clients, under the above restriction on the route length.
One line with two integers N and M, separated by a single space, with 2 ≤ N ≤ 1,000 and 1 ≤ M ≤ 10, 000: the number of cities and the number of roads in the road map.
M lines, each with three integers A, B and L, separated by single spaces, with 1 ≤ A, B ≤ N, A ≠ B and 1 ≤ L ≤ 1,000, describing a road from city A to city B with length L.
The roads are unidirectional. Hence, if there is a road from A to B, then there is not necessarily also a road from B to A. There may be different roads from a city A to a city B.
One line with two integers S and F, separated by a single space, with 1 ≤ S, F ≤ N and S ≠ F: the starting city and the final city of the route.
There will be at least one route from S to F.
Sample Input
2
5 8
1 2 3
1 3 2
1 4 5
2 3 1
2 5 3
3 4 2
3 5 4
4 5 3
1 5
5 6
2 3 1
3 2 1
3 1 10
4 5 2
5 2 7
5 2 7
4 1
Sample Output
3
2
题意:有T组测试数据,单向边,求S到T的最短路径方案数和次短路径方案数
如果次短路径长度=最短路径长度+1,输出最短路径数+次短路路径数
否则输出最短路径数
题解:
用dijkstra求得方案数以及道路长度
在松弛的时候搞些事情:
用一个二维数组d[i][0/1]记录每一个节点距离起始点的最短距离和次短距离;
再开一个二维数组sum[i][0/1]记录路径数
更新状态时:
1)新值小于最短路径长:更新最短路径长,计数和次短路径长,计数
2)新值等于最短路径长:更新最短路径计数
3)新值大于最短路径长,小于次短路径长:更新次短路径长,计数
4)新值等于次短路径长:更新次短路径计数
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<algorithm> 6 #include<cmath> 7 #define R register 8 #define ll long long 9 #define inf 2047483600 10 #define mod 100003 11 #define DB double 12 using namespace std; 13 inline int read() 14 { 15 R int x=0,w=1;char ch=getchar(); 16 while(!isdigit(ch)){if(ch==‘-‘) w=-1;ch=getchar();} 17 while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch-‘0‘),ch=getchar(); 18 return x*w; 19 } 20 const int N=4001000; 21 struct node{ 22 int u,v,c,ne; 23 }e[N]; 24 int h[N],n,m,tot; 25 void add(R int u,R int v,R int c) 26 { 27 tot++;e[tot]=(node){u,v,c,h[u]};h[u]=tot; 28 } 29 int T,s,t; 30 int sum[N][2],d[N][2]; 31 bool v[N][2]; 32 struct kk{ 33 int id,fg; 34 bool operator<(const kk&x)const{ 35 return d[id][fg]>d[x.id][x.fg]; 36 } 37 }; 38 priority_queue<kk>q; 39 void dijkstra() 40 { 41 for(int i=1;i<=n;++i) 42 { 43 d[i][0]=d[i][1]=inf; 44 v[i][0]=v[i][1]=0; 45 sum[i][0]=sum[i][1]=0; 46 } 47 d[s][0]=0;sum[s][0]=1; 48 q.push((kk){s,0}); 49 while(!q.empty()) 50 { 51 int ff=q.top().id,fg=q.top().fg;q.pop(); 52 if(v[ff][fg]) continue; 53 v[ff][fg]=1; 54 for(int i=h[ff];i;i=e[i].ne) 55 { 56 int rr=e[i].v,dis=d[ff][fg]+e[i].c; 57 if(dis<d[rr][0]) 58 { 59 if(d[rr][0]!=inf) 60 { 61 d[rr][1]=d[rr][0];sum[rr][1]=sum[rr][0]; 62 q.push((kk){rr,1}); 63 } 64 d[rr][0]=dis;sum[rr][0]=sum[ff][fg]; 65 q.push((kk){rr,0}); 66 }else if(dis==d[rr][0]) sum[rr][0]+=sum[ff][fg]; 67 else if(dis<d[rr][1]) 68 { 69 d[rr][1]=dis;sum[rr][1]=sum[ff][fg]; 70 q.push((kk){rr,1}); 71 }else if(dis==d[rr][1]) sum[rr][1]+=sum[ff][fg]; 72 } 73 } 74 if(d[t][0]+1==d[t][1]) cout<<sum[t][0]+sum[t][1]<<endl; 75 else cout<<sum[t][0]<<endl; 76 } 77 int main() 78 { 79 T=read(); 80 while(T--) 81 { 82 n=read();m=read(); 83 tot=0; 84 for(int i=1;i<=n;++i) h[i]=0; 85 for(int i=1;i<=m;++i) 86 { 87 int x,y,z;x=read();y=read();z=read(); 88 add(x,y,z); 89 } 90 s=read();t=read(); 91 dijkstra(); 92 } 93 return 0; 94 }
消杀的妄心尽而后真心现。