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 #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
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
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