题目:
http://blog.csdn.net/qq_35786326/article/details/79049261
题意:
求在哪个位置设置商店,可以使得距离最短
分析:
看起来好像需要我们去一个个枚举,比较麻烦。但毕竟我们已经学了最短路了,那我们就可以使用Floyd算法。
在最短路径问题中,我们已经学过了一个叫Dijkstra的算法,其的作用是可以只求出一点到所有点的距
离,而Floyd则是可以求出所有点到其他点的距离。
我的思路是先用Floyd算法求出所有点,然后再用一重循环求出最小值,最后输出
代码:#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int x[202][202];
int main()
{
int n,m,a,b;
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{x[i][j]=read();if(x[i][j]==0&&i!=j) x[i][j]=99999999;//如果他到不了哪个点,就直接赋予一个较大的数}
for(int k=1;k<=n;k++)//Floyd
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(x[i][k]+x[k][j]<x[i][j]) x[i][j]=x[i][k]+x[k][j];
int t=0,mint=2147483647;
for(int i=1;i<=n;i++)//枚举哪个点最优
{
t=0;
for(int j=1;j<=n;j++) t+=x[i][j];
if(mint>t) mint=t;
}
printf("%d",mint);
return 0;
}
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int x[202][202];
int main()
{
int n,m,a,b;
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{x[i][j]=read();if(x[i][j]==0&&i!=j) x[i][j]=99999999;//如果他到不了哪个点,就直接赋予一个较大的数}
for(int k=1;k<=n;k++)//Floyd
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(x[i][k]+x[k][j]<x[i][j]) x[i][j]=x[i][k]+x[k][j];
int t=0,mint=2147483647;
for(int i=1;i<=n;i++)//枚举哪个点最优
{
t=0;
for(int j=1;j<=n;j++) t+=x[i][j];
if(mint>t) mint=t;
}
printf("%d",mint);
return 0;
}