这边的大佬说要用堆优化的
d
j
i
k
djik
djik
那边的神仙说邻接表SPFA卡常
我默默地敲了一个邻接矩阵的
S
P
F
A
SPFA
SPFA,
还跑了
m
+
1
m+1
m+1次,结果——
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int n,tot,m,w,x[50010],y[50010],z,zx,zd;
int v[10010],a[1010][1010];
int dis[10010];
void spfa(int x) //裸SPFA
{
queue<int>p;
dis[x]=0,v[x]=1,p.push(x);
while(!p.empty())
{
int x1=p.front();p.pop();
for(int i=1; i<=n; i++)
if(dis[x1]+a[x1][i]<dis[i]&&a[x1][i]!=0)
{
dis[i]=dis[x1]+a[x1][i];
if(!v[i])
{
p.push(i);
v[i]=1;
}
}
v[x1]=0;
}
}
int main()
{
freopen("rblock.in","r",stdin);
freopen("rblock.out","w",stdout);
memset(dis,1,sizeof(dis));
cin>>n>>m;
for(int i=1; i<=m; i++)
{
cin>>x[i]>>y[i]>>z;
a[x[i]][y[i]]=z;
a[y[i]][x[i]]=z;
}
spfa(1);
zx=dis[n];
for(int i=1; i<=m; i++)
{
memset(dis,1,sizeof(dis));
memset(v,0,sizeof(v));
a[x[i]][y[i]]*=2; //放干草堆处理
a[y[i]][x[i]]*=2;
spfa(1);
zd=max(zd,dis[n]);
a[x[i]][y[i]]/=2; //撤干草堆处理
a[y[i]][x[i]]/=2;
}
cout<<zd-zx;
return 0;
}