洛谷Luogu-1364 医院设置 (Floyd,最短路) HQG_AC的博客

代码战绩:0ms,25行,易懂

算法:Floyd求最短路

因为n小的只有100,所以用Floyd O(n^3) 的算法也能轻松搞定。

1.读入,存图,用邻接矩阵存0,1,表示有没有边

2.Floyd求最短路

3.算出每个医院设在i点所需要的费用

4.输出

详见代码:

#include 
#define INF 99999999
#define N 101
#define fr(i,n,m) for (int i=n;i<=m;i++)
using namespace std;
int a[N][N],b[N];
int n,c[2] ;//c[1]表示左链接,c[2]表示右链接 
int main() 
{
	scanf("%d",&n);
	fr(i,1,n) fr(j,1,n) a[i][j]=INF;  //初始化
	fr(i,1,n){
		scanf("%d%d%d",&b[i],&c[0],&c[1]);
		fr(j,0,1) if (c[j]!=0) a[i][c[j]]=a[c[j]][i]=1;  //将相连的点连接起来
	}
	fr(k,1,n) fr(i,1,n) fr(j,1,n)//Floyd求最短路 
	if (a[i][j]>a[i][k]+a[k][j] && k!=i && i!=j && j!=k ) a[i][j]=a[i][k]+a[k][j];
	int ans=2147483647;
	fr(i,1,n){//算出如果医院设在i点所需的费用
		int sum=0;
		fr(j,1,n) if (i!=j) sum+=a[j][i]*b[j];  
		ans=min(ans,sum) ;
	}
	printf("%d\n",ans); 
}


你可能感兴趣的:(————图论————)