Input
* Line 1: Three space-separated integers: N, M, and T * Lines 2..M+1: Line i+1 contains three space-separated integers: Si , Ei , and Hi * Lines M+2..M+T+1: Line i+M+1 contains two space-separated integers that describe task i: Ai and BiOutput
* Lines 1..T: Line i contains the result for task i and tells the smallest possible maximum height necessary to travel between the stations. Output -1 if it is impossible to travel between the two stations.Sample Input
5 6 3 1 2 12 3 2 8 1 3 5 2 5 3 3 4 4 2 4 8 3 4 1 2 5 1Sample Output
4 8 -1题目大意: 给你个N点M条边的图,T次询问S到E的所有路径中最大权值最小的那条路径的最大权值。 大体思路: 起点不固定, 4w次的询问prim算法一定超时。 可以采用一种Floyd算法的小小的变形找出任意两点的符合条件的权值。这样询问时时间复杂的为O(1), 处理时间复杂度为O(n^3).
#include <iostream> #include <string> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #define INF 0x3f3f3f3f #define N 400 using namespace std; int dis[N][N]; int n, m, t; int main() { scanf("%d%d%d", &n, &m, &t); memset(dis, INF, sizeof(dis)); for(int i = 1; i <= m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); dis[u][v] = w; } for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(dis[i][j] > max(dis[i][k], dis[k][j])) { dis[i][j] = max(dis[i][k], dis[k][j]); } } } } for(int i = 0; i < t; i++) { int s, e; scanf("%d%d",&s, &e); if(dis[s][e] < INF) { printf("%d\n", dis[s][e]); } else { printf("-1\n"); } } return 0; }