两点之间的最小距离,dijkstra是计算某个点到其余点的最短路径,而floyd计算任意两点间最短路
感觉两个差不多,对于某两个点a,b之间 的距离,找到一个点c,比较原距离是否大于ac的距离加cb的距离之和,我感觉我还没有深刻的理解,总是觉得会出什么疏漏,然而也找不到解决的方法,摊手,以后再多加理解
两道题输入格式是一样的,参考了hdu2112
/*************************dijkstra
//
// main.cpp
// dijkstra
//
// Created by Mr.Xue on 17/1/18.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <iostream>
using namespace std;
#define INF 10000
int a[1000][1000],n,d[INF];
void Init()
{
for(int i=0;i<=150;i++)
{
for(int j=0;j<150;j++)
{
if(i==j)
a[i][j]=0;
else
a[i][j]=INF;
}
}
}
void dijkstral()
{
int vis[INF];
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
d[i]=INF;
d[1]=0;
for(int i=1;i<=n;i++)
{
int temp=INF,x;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&d[j]<temp)
{
temp=d[j];
x=j;
//printf("%d ",x);
}
}
vis[x]=1;
if(temp==INF)
break;
for(int j=1;j<=n;j++)
{
if(d[j]>d[x]+a[x][j])
d[j]=d[x]+a[x][j];
//printf("%d ",d[j]);
}
}
}
int main()
{
int i,j,s,e,w;
while(~scanf("%d",&n)&&n!=-1)
{
Init();
scanf("%d %d",&s,&e);
for(int k=0;k<n;k++)
{
scanf("%d %d %d",&i,&j,&w);
a[i][j]=a[j][i]=w;
}
dijkstral();
for(i=1;i<=n;i++)
printf("%d ",d[i]);
printf("\n");
}
return 0;
}
/*
6
1 2
1 3 60
1 4 30
3 5 20
4 6 10
1 6 50
6 2 10
*/
/**********************/
// main.cpp
// floyd
//
// Created by Mr.Xue on 17/1/18.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <iostream>
using namespace std;
#define INF 10000
int a[1000][1000],n,d[INF];
void Init()
{
for(int i=0;i<=150;i++)
{
for(int j=0;j<150;j++)
{
if(i==j)
a[i][j]=0;
else
a[i][j]=INF;
}
}
}
void floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}
}
}
}
int main()
{
int i,j,s,e,w;
while(~scanf("%d",&n)&&n!=-1)
{
Init();
scanf("%d %d",&s,&e);
for(int k=0;k<n;k++)
{
scanf("%d %d %d",&i,&j,&w);
a[i][j]=a[j][i]=w;
}
floyd();
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
return 0;
}