【图论】【最短路】商店选址问题

Description

给出一个城市的地图(用邻接矩阵表示),商店设在一点,使各个地方到商店距离之和最短。

Input

第一行为n(共有几个城市); N小于201
第二行至第n+1行为城市地图(用邻接矩阵表示);

Output

最短路径之和;

Sample Input
3
0 3 1
3 0 2
1 2 0
Sample Output
3

前言

之前用的是SPFA,但不知为什么错了
有知道错误的 d a l a o dalao ,麻烦在评论区告诉我

#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;
}

猜你喜欢

转载自blog.csdn.net/SSL_wujiajie/article/details/88315247