P6464 传送门

文章目录

        • R e s u l t Result Result
        • H y p e r l i n k Hyperlink Hyperlink
        • D e s c r i p t i o n Description Description
        • S o l u t i o n Solution Solution
        • C o d e Code Code

R e s u l t Result Result

P6464 传送门_第1张图片


H y p e r l i n k Hyperlink Hyperlink

https://www.luogu.com.cn/problem/P6464


D e s c r i p t i o n Description Description

一张有 n n n个点, m m m条边的无向图,你可以选择两个点作为传送点,将这两个点之间的距离变成0,试选取这样的两个点,使得修改后所有点间最短路之和最小

数据范围: n ≤ 100 n\leq 100 n100


S o l u t i o n Solution Solution

这数据范围显然 f l o y d floyd floyd
枚举两个点作为传送点,然后跑 f l o y d floyd floyd更新即可

时间复杂度: O ( n 4 ) O(n^4) O(n4),要开O2


C o d e Code Code

#include
#include
#include
#include
#define LL long long
using namespace std;int n,m,f[101][101],F[101][101],a,b,c,ans=0x3f3f3f3f;
inline LL read()
{
     
	char c;LL d=1,f=0;
	while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
	while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
	return d*f;
}
signed main()
{
     
	memset(f,0x3f,sizeof(f));
	n=read();m=read();
	for(register int i=1;i<=n;i++) f[i][i]=0;
	for(register int i=1;i<=m;i++)
	{
     
		a=read();b=read();c=read();
		f[a][b]=f[b][a]=c;
	}
	for(register int k=1;k<=n;k++)
	 for(register int i=1;i<=n;i++) if(i!=k)
	  for(register int j=1;j<=n;j++) if(j!=i&&j!=k)
	   f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
	for(register int i=1;i<=n;i++)
	 for(register int j=1;j<=n;j++)
	{
     
		for(register int x=1;x<=n;x++)
		 for(register int y=1;y<=n;y++)
		  F[x][y]=f[x][y];
		F[i][j]=F[j][i]=0;
		for(register int x=1;x<=n;x++) if(x!=i)
		 for(register int y=1;y<=n;y++) if(y!=i&&y!=x)
		  F[x][y]=min(F[x][y],F[x][i]+F[i][y]);
		for(register int x=1;x<=n;x++) if(x!=j)
		 for(register int y=1;y<=n;y++) if(y!=j&&y!=x)
		  F[x][y]=min(F[x][y],F[x][j]+F[j][y]);
		int now=0;
		for(register int x=1;x<=n;x++)
		 for(register int y=1;y<x;y++)
		  now+=F[x][y];
		ans=min(ans,now);
	}
	printf("%d",ans);
}

你可能感兴趣的:(P6464,传送门)