就当做一个Floyd的模板来练练手吧
P1318 -- [NOIP福建夏令营]最短路
时间限制:1000MS
内存限制:131072KB
Description
给出N个点,M条无向边的简单图,问所有点对之间的最短路。
Input Format
第1行两个正整数N,M(N<=100,M<=5000) 下面M行,每行3个正整数x, y, w,为一条连接顶点x与y的边权值为w。(x<=n,y<=n,w<=1000)
Output Format
包括N行,每行N个数,第i行第j个数为点i到点j的最短路,第i行第i个数应为0,数字之间空格隔开。
Sample Input
5 10 3 2 1 2 4 7 5 3 4 4 1 2 5 1 8 3 4 10 5 4 9 2 5 2 1 2 1 3 1 10
Sample Output
0 1 2 2 3 1 0 1 3 2 2 1 0 4 3 2 3 4 0 5 3 2 3 5 0
【题解】
#include<bits/stdc++.h> using namespace std; int n,m,dis[101][101]; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) dis[i][j]=2100000; for (int i=1;i<=m;++i) { int a,b,w; scanf("%d%d%d",&a,&b,&w); dis[a][b]=dis[b][a]=w; } for(int i=1;i<=n;++i) dis[i][i]=0; for (int k=1;k<=n;++k) for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) if(dis[i][k]+dis[k][j]<dis[i][j]) dis[i][j]=dis[i][k]+dis[k][j]; for (int i=1;i<=n;++i) { for (int j=1;j<=n;++j) printf("%d ",dis[i][j]); printf(" "); } return 0; }
Floyd的裸题,来练练手