Description
给出一个城市的地图(用邻接矩阵表示),商店设在一点,使各个地方到商店距离之和最短。
Input
第一行为n(共有几个城市); N小于201
第二行至第n+1行为城市地图(用邻接矩阵表示);
Output
最短路径之和;
Sample Input
3
0 3 1
3 0 2
1 2 0
Sample Output
3
前言
之前用的是SPFA,但不知为什么错了
有知道错误的
,麻烦在评论区告诉我
#include<iostream>
#include<cstdio>
#include<queue>
#define INF 1e9
using namespace std;
int f[1005][1005],dis[1005];
int n,m,ans=INF;
bool b[1005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
scanf("%d",&f[i][j]);
if (i!=j && f[i][j]==0)f[i][j]=INF;
}
for(int k=1;k<=n;++k)
{
memset(dis,0x3f,sizeof(dis));
memset(b,0,sizeof(b));
dis[k]=0;
queue<int>w;
w.push(k);
while(!w.empty())
{
int tt=w.front();
w.pop();
for(int i=1;i<=n;++i)
{
if(dis[i]>dis[tt]+f[tt][i] && i!=k)
{
dis[i]=dis[tt]+f[tt][i];
if(!b[i])
{
w.push(i);
b[i]=1;
}
}
}
b[tt]=0;
}
m=0;
for(int i=1;i<=n;++i)
m+=dis[i];
ans=min(ans,m);
}
printf("%d",ans);
return 0;
}
思路
跑一边Floyed,然后枚举每一个点,计算最小的最短路径和
#include<iostream>
#include<cstdio>
#define INF 1e9
using namespace std;
int f[205][205];
int n,m,ans=INF;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
scanf("%d",&f[i][j]);
if (i!=j && f[i][j]==0)f[i][j]=INF;
}
for(int k=1;k<=n;++k)//Floyed
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
for(int i=1;i<=n;++i)
{
m=0;
for(int j=1;j<=n;++j)
m+=f[i][j];
ans=min(ans,m);
}
printf("%d",ans);
return 0;
}