题目描述
有向图中存在$n$个节点,每个节点之间有道路相连,共有$m$条道路,给出$Q$此询问,包含起点和终点,请输出两点间最短距离$L\min$.
输入描述
第一行$3$个整数$n,m,Q$.
第$2$到$(m+1)$行,输入每条路的起点$u_i$,终点$v_i$,权值$w_i$.
第$(m+2)$到$(m+Q+2)$行,输入起点$U_i$,终点$V_i$.
输出描述
$m$行,每行一个整数,表示$U_i$到$V_i$的最短路径$L_i\min$,如果到不了,输出No way.
.
$Model:$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include<iostream> #include<cstring> #define MAXN 105 #define refer127 2139062143 using namespace std; int dist[MAXN][MAXN],p[MAXN][MAXN],n,m,q; int main(){ memset(p,255,sizeof(p)); memset(dist,127,sizeof(dist)); int u,v,w; scanf("%d%d%d",&n,&m,&q); for(int i = 1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); dist[u][v]=w; p[u][v]=u; } for(int i = 1;i<=n;i++) dist[i][i]=0; for(int i = 1;i<=n;i++){ for(int j = 1;j<=n;j++){ if(dist[j][i]!=0&&dist[j][i]!=refer127){ for(int w = 1;w<=n;w++){ if(dist[i][w]!=refer127){ if(dist[j][w]>dist[j][i]+dist[i][w]){ dist[j][w]=dist[j][i]+dist[i][w]; p[j][w]=p[i][w]; } } } } } } for(int i = 1;i<=q;i++){ scanf("%d%d",&u,&v); if(dist[u][v]==refer127){ printf("No way.\n"); }else printf("%d\n",dist[u][v]); } }
|