T145192 【2020.8.23NOIP模拟赛】最优路线(Floyd)

最优路线

T145192 【2020.8.23NOIP模拟赛】最优路线(Floyd)_第1张图片

解题思路

这题就是Floyd算法
但是要加许多玄学优化
比如:
inline 加在子程序前
快读(两个) 加在输入上
register 加在定义和循环前
O2优化 加在开头
把i++改为++i

AC代码

#pragma GCC optimize(2)//O2玄学
#include
#include
#include
#include
using namespace std;
long long n,m,x,y,z,v[5000005],b[505][505],f[505][505];
struct node
{
     
	long long ans,sum;
}a[5000005];
inline bool cmp(node x,node y)//inline玄学
{
     
	return x.ans<y.ans;
}
inline int read()
{
     
	register int X=0;//register玄学
	register bool flag=1;
	register char ch=getchar();
	while(ch<'0'||ch>'9')
	 {
     
	   if(ch=='-')
	     flag=0; 
		 ch=getchar();
	 }
	while(ch>='0'&&ch<='9')
	 {
     
	    X=(X<<1)+(X<<3)+ch-'0';
		ch=getchar();
	 }
	if(flag) 
	  return X;
	return ~(X-1);
}
int main()
{
     
	ios::sync_with_stdio(false);//快读玄学
	memset(b,0x7f,sizeof(b));
	memset(f,0x7f,sizeof(f));
	n=read();//快读玄学
	m=read();
	for(register int i=1;i<=n;++i)//register玄学
	{
     
		a[i].ans=read();
	 	v[i]=a[i].ans;
	 	a[i].sum=i;
		f[i][i]=0;
	}
	sort(a+1,a+n+1,cmp);
	for(register int i=1;i<=m;++i)
	{
     
		x=read();
		y=read();
		z=read();
		b[x][y]=b[y][x]=z;//边权值
		f[x][y]=f[y][x]=min(f[x][y],max(v[x],v[y])*b[x][y]);//最小值
	} 
	for(register int p=1;p<=n;++p)//Floyd
	{
      
		long long k=a[p].sum;
	 	for(register int i=1;i<=n;++i)
	  	 for(register int j=1;j<=n;++j)
	   	  if(b[i][j]>max(b[i][k],b[k][j]))
	      {
     
	    	b[i][j]=max(b[i][k],b[k][j]);
	    	f[i][j]=min(f[i][j],max(v[i],max(v[j],v[k]))*b[i][j]);
	      }
	}
	for(register int i=1;i<=n;++i)//输出
	{
     
	 	for(register int j=1;j<=n;++j)
	 	{
     
			if(i==j)printf("0 ");
	  		else if(f[i][j]==0)printf("-1 ");
	  		else printf("%lld ",f[i][j]);    
	 	}
		printf("\n");
	}
	return 0;
}

谢谢

你可能感兴趣的:(最短路径)