floyd算法回顾 http://ideone.com/R8ixAH
只需要一个矩阵保持最短距离;
假设n各节点。
1 枚举每个节点t 作为中间节点,也称作松弛节点 O(n)
{
2 枚举每个开始节点i O(n)
{
3 枚举每个结束结束节点j O(n)
{
判断当前已知的i到j的距离是否比经过t节点长,如果是,修改ij距离。O(1)
}
}
开销是O(n*n*n)
#include<iostream> #include<vector> #include<algorithm> #include<cstring> using namespace std; int dis[110][110]; int main() { int n,m; cin>>n>>m; memset(dis,0x0f,sizeof(dis)); int v,u,d; for(int i=0;i<m;i++) { cin>>v>>u>>d; v--; u--; dis[v][u]=min(dis[v][u],d); dis[u][v]=min(dis[u][v],d); } for(int t=0;t<n;t++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i==j) { dis[i][j]=0; continue; } dis[i][j] = min(dis[i][j],dis[i][t]+dis[t][j]); } } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cout<<dis[i][j]<<" "; } cout<<endl; } return 0; }