【问题描述】 | |||
给出N个顶点,M条无向带权边的连通图,和Q个查询:请编程回答: 问1、两点之间的最短路径(边权和最小的路径); 问2、两点之间的所有路径中,需要经过的最小边的最大的路径(最大边最小); 问3、两点之间的所有路径中,需要经过的的最大边的最小的路径(最小边最大); |
【输入】 | |||
第一行:N(N<=400),M(M<=10000),Q(Q<=100)查询数量。接下来M行,每行三个整数:x,y,t( 1<=x,y<=N,0<t<=1000000),表示顶点x与y有边,边权为t。 再接下来Q行,每行两个整数i,j(1<=i,j<=N),表示要查询顶点i到顶点j的路径上三个问题。 |
【输出】 | |||
包含Q行,对应输入数据中的查询。 |
【样例输入】 | |||
6 8 2 1 6 1 6 5 1 1 2 9 4 6 3 5 2 7 5 3 4 2 3 1 4 3 3 1 2 6 2 |
【样例输出】 | |||
7 9 3 6 3 3 |
|
|
| |
| 【数据范围】 |
| |
|
|
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXN 400+10 #define oo (LL)10000*1000000+10 using namespace std; typedef long long LL; int N,M,Q; LL g1[MAXN][MAXN],g2[MAXN][MAXN],g3[MAXN][MAXN]; LL MAX(LL x,LL y) { return x>y?x:y; } LL MIN(LL x,LL y) { return x
>N>>M>>Q; ready(); for(int i=1;i<=M;i++){ int x,y,t; scanf("%d%d%d",&x,&y,&t); g1[x][y]=g1[y][x]=t; g2[x][y]=g2[y][x]=t; g3[x][y]=g3[y][x]=t; } } void floyd() { for(int k=1;k<=N;k++) for(int i=1;i<=N;i++) for(int j=1;j<=N;j++){ LL t; if(g1[i][k]