最优路线
解题思路
这题就是Floyd算法
但是要加许多玄学优化
比如:
inline 加在子程序前
快读(两个) 加在输入上
register 加在定义和循环前
O2优化 加在开头
把i++改为++i
AC代码
#pragma GCC optimize(2)//O2玄学
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
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;
}