最短路+1

1、最短路上的统计

题目:一个无向图,没有自环,所有边的权值均为1,对于一个点对(a,b),输出a,b之间所有最短路上的点的总个数。

题解:floyed求出所有的最短路,

如果 map[a,b]=map[a,k]+map[k,b] 那么 k 就是 a b 最短路上的点。最后输出总个数+2。

编译通过... 
├  测试数据  01:答案正确...  0 ms 
├  测试数据  02:答案正确...  0 ms 
├  测试数据  03:答案正确...  0 ms 
├  测试数据  04:答案正确...  0 ms 
├  测试数据  05:答案正确...  0 ms 
├  测试数据  06:答案正确...  0 ms 
├  测试数据  07:答案正确...  0 ms 
├  测试数据  08:答案正确...  0 ms 
├  测试数据  09:答案正确...  0 ms 
├  测试数据  10:答案正确...  0 ms 
------------------------- 
Accepted  有效得分:100 有效耗时:0 ms  

 

 

View Code 
 1 #include <stdio.h>
 2  #define N 101
 3  int main()
 4 {
 5      int map[N][N];
 6      int i,j,k,n,m,t,s,a,b;
 7     scanf( " %d%d ",&n,&m);
 8      for(i= 1;i<=n;i++)
 9          for(j= 1;j<=n;j++)
10             map[i][j]= 999999;
11      for(i= 0;i<m;i++)
12     {
13         scanf( " %d%d ",&a,&b);
14         map[a][b]= 1;
15         map[b][a]= 1;
16     }
17      for(k= 1;k<=n;k++)
18          for(i= 1;i<=n;i++)
19              for(j= 1;j<=n;j++)
20                  if(map[i][k]+map[k][j]<map[i][j])
21                     map[i][j]=map[i][k]+map[k][j];
22     scanf( " %d ",&t);
23      while(t--)
24     {
25         s= 0;
26         scanf( " %d%d ",&a,&b);
27          for(i= 1;i<=n;i++)
28              if(map[a][i]+map[i][b]==map[a][b]&&i!=a&&i!=b)
29                 s++;
30         printf( " %d\n ",s+ 2);
31     }
32      return  0;
33

 

 

2、 想越狱的小杉

描述 Description
小杉看了看自己的纹身,明白了整个管道网是由N个小房间和若干小房间之间的单向的管道组成的。 小房间编号为不超过N的正整数。 每个管道都有一个人品限制值,小杉只能在人品不 超过该限制值时通过。 小杉一开始在房间1,现在小杉想知道,每个小房间他最多能够以人品多少的状态到达。 注意,小杉的人品在出发以后是不会改变的。
输入格式 Input Format
每组测试数据的 
第一行有一个正整数N(1<=N<=2000)。 
接下来若干行描述管道,每行三个正整数A,B,R(1<=A,B<=N, 1<=R<1e5, A<>B),表示A房间有一条到达B房间的人品限制值为R的管道(注意从B房间不可由此管道到达A房间,即 管道是单向的,每组A,B至多只出现一次)。 
整个输入数据以一行0 0 0结束。 
输出格式 Output Format
N-1行 

为到达2~n个房间时的最大人品 

 编译通过... 

├  测试数据  01:答案正确...  0 ms 
├  测试数据  02:答案正确...  0 ms 
├  测试数据  03:答案正确...  0 ms 
├  测试数据  04:答案正确...  41 ms 
├  测试数据  05:答案正确...  0 ms 
├  测试数据  06:答案正确...  0 ms 
├  测试数据  07:答案正确...  0 ms 
├  测试数据  08:答案正确...  0 ms 
├  测试数据  09:答案正确...  0 ms 
├  测试数据  10:答案正确...  0 ms 
------------------------- 

Accepted 有效得分:100 有效耗时:41ms  

 

 

View Code 
 1 #include <stdio.h> 
 2  int n; 
 3  long map[ 2001][ 2001]={ 0}; 
 4  int mark[ 2001]={ 0}; 
 5  long maxrp[ 2001]={ 0}; 
 6  long min( long a, long b) 
 7 {
 8      return a<b?a:b;
 9 }
10  int main() 
11 { 
12      long a,b,c; 
13     scanf( " %d ",&n); 
14      while(~scanf( " %d%d%ld ",&a,&b,&c)) 
15     { 
16          if(a== 0&&b== 0&&c== 0
17              break;      
18         map[a][b]=c;         
19     } 
20      int i,j,k; 
21      long maxcost= 0,maxnum; 
22     maxrp[ 1]= 0;mark[ 1]= 1
23      for(i= 2;i<=n;i++)
24         maxrp[i]=map[ 1][i];
25      for(k= 1;k<=n;k++) 
26     {
27         maxcost= 0;
28         maxnum= 0
29          for(i= 1;i<=n;i++) 
30              if(!mark[i])
31                  if(maxrp[i]>maxcost) 
32                 { 
33                     maxcost=maxrp[i]; 
34                     maxnum=i;
35                 } 
36         mark[maxnum]= 1
37          for(j= 1;j<=n;j++) 
38              if(!mark[j]) 
39                  if(maxrp[j]<min(maxrp[maxnum],map[maxnum][j])) 
40                     maxrp[j]=min(maxrp[maxnum],map[maxnum][j]);  
41     } 
42      for(i= 2;i<=n;i++) 
43         printf( " %ld\n ",maxrp[i]); 
44      return  0;
45

 

 

3、 最佳路线

描述 Description
年久失修的赛道令国际汽联十分不满。汽联命令主办方立即对赛道进行调整,否则将取消其主办权。主办方当然必须马上开始行动。 
赛道测评人员经过了三天三夜的数据采集,选出了若干可以使用的道路和各道路行驶所需的时间。这些道路包括若干直道和弯道,每个直道连接两个不同的弯道且为单向,两个弯道之间可 能有多条直道,通过直道和弯道都需要一定的时间。主办方打算在这些可用道路中选出一部分作为赛道。赛道是由直道和弯道交替组成的一圈,赛道可多次经过同一条弯道,因为主办方可 以通过架设立交桥的方法避免撞车。为了使比赛更加精彩,主办方希望选择一条单圈时间最短的赛道,由于观众席的位置在弯道1,所以赛道必须经过弯道1(赛道至少要包含一条直 道)。
输入格式 Input Format
第一行是两个整数n,m(1<=n<=200,1<=m<=100000),分别表示弯道数和直道数。接下来n行,第i行是一个整数ai(1<=ai<=1000),表示通过第i个弯道所消耗的时间。接 下来m行,第j行是三个整数xj,yj,bj(1<=xj,yj<=n,1<=bj<=1000),表示从弯道xj到弯道yj有一条单向直道,且通过该直道所消耗的时间为bj。
输出格式 Output Format

一个整数s,表示单圈时间最短的赛道的单圈时间,若无解则输出-1。 

 

 编译通过... 

├  测试数据  01:答案正确...  0 ms 
├  测试数据  02:答案正确...  0 ms 
├  测试数据  03:答案正确...  0 ms 
├  测试数据  04:答案正确...  0 ms 
├  测试数据  05:答案正确...  0 ms 
├  测试数据  06:答案正确...  0 ms 
├  测试数据  07:答案正确...  25 ms 
├  测试数据  08:答案正确...  0 ms 
├  测试数据  09:答案正确...  0 ms 
├  测试数据  10:答案正确...  0 ms 
------------------------- 

Accepted 有效得分:100 有效耗时:25ms  


View Code 
 1 #include <stdio.h>
 2  #define N 201
 3  int main()
 4 {
 5      int d[N],map[N][N];
 6      int a,b,c,n,m,i,j,k;
 7     scanf( " %d%d ",&n,&m);
 8      for(i= 1;i<=n;i++)
 9         scanf( " %d ",&d[i]);
10      for(i= 1;i<=n;i++)
11          for(j= 1;j<=n;j++)
12             map[i][j]= 99999;
13      for(i= 0;i<m;i++)
14     {
15         scanf( " %d%d%d ",&a,&b,&c);
16         c+=d[b];
17          if(c<map[a][b])
18             map[a][b]=c;
19     }
20      for(k= 1;k<=n;k++)
21          for(i= 1;i<=n;i++)
22                  for(j= 1;j<=n;j++)
23                      if((map[i][k]+map[k][j]<map[i][j]))
24                         map[i][j]=map[i][k]+map[k][j];
25      if(map[ 1][ 1]== 99999)
26         puts( " -1 ");
27      else
28         printf( " %d\n ",map[ 1][ 1]);
29      return  0;
30

 

 

 

你可能感兴趣的:(最短路)