1、最短路上的统计

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

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

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

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

 

 

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:答案正确... 0ms 
├ 测试数据 02:答案正确... 0ms 
├ 测试数据 03:答案正确... 0ms 
├ 测试数据 04:答案正确... 41ms 
├ 测试数据 05:答案正确... 0ms 
├ 测试数据 06:答案正确... 0ms 
├ 测试数据 07:答案正确... 0ms 
├ 测试数据 08:答案正确... 0ms 
├ 测试数据 09:答案正确... 0ms 
├ 测试数据 10:答案正确... 0ms 
------------------------- 

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:答案正确... 0ms 
├ 测试数据 02:答案正确... 0ms 
├ 测试数据 03:答案正确... 0ms 
├ 测试数据 04:答案正确... 0ms 
├ 测试数据 05:答案正确... 0ms 
├ 测试数据 06:答案正确... 0ms 
├ 测试数据 07:答案正确... 25ms 
├ 测试数据 08:答案正确... 0ms 
├ 测试数据 09:答案正确... 0ms 
├ 测试数据 10:答案正确... 0ms 
------------------------- 

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

 

 

 

posted on 2012-07-17 08:01  pony1993  阅读(331)  评论(0编辑  收藏  举报

View My Stats