虽然第11个点可以Hack出大部分的“跑一次最短路”的算法,但一些玄学代码仍然可以过,比如:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 505, MAXM = 505, INF = INT_MAX/2, inf = 1;
struct node{
int l,c;
}mp[MAXN][MAXN],dst[MAXN];
int n,m,x;
bool vst[MAXN];
void init(int n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j].l = INF;
}
}
}
void dijkstra(int u){
for(int i=1;i<=n;i++) dst[i].l = INF,vst[i] = false;
dst[u].l = 0;dst[u].c = INF;
for(int i=1;i<n;i++){
int maxt=INF,k=0;
for(int j=1;j<=n;j++){
if(dst[j].l == INF || vst[j]) continue;
int tmp = dst[j].l + x/dst[j].c;
if(maxt > tmp) maxt = tmp,k=j;
}
if(k == 0) break;
vst[k] = true;
for(int j=1;j<=n;j++){
if(mp[k][j].l == INF) continue;
int tmpj;
if(dst[j].l == INF) tmpj = INF;
else tmpj = dst[j].l + x/dst[j].c;
int tmpk = dst[k].l + mp[k][j].l + x/(min(dst[k].c,mp[k][j].c));
if(tmpk < tmpj) dst[j].l = dst[k].l + mp[k][j].l,dst[j].c = min(dst[k].c,mp[k][j].c);
}
}
}
int main(){
cin>>n>>m>>x;
init(n);
for(int i=1;i<=m;i++){
int a,b,c,d;cin>>a>>b>>c>>d;
mp[a][b].l = mp[b][a].l = c;
mp[a][b].c = mp[b][a].c = d;
}
dijkstra(1);
if(dst[n].l == INF) cout<<-1;
else cout<<dst[n].l + x/dst[n].c;
return 0;
}
所以,@Jorge_Filho又重新造了一组数据:
5 5 10000
1 2 9999 6
1 3 10000 10000
2 4 9999 7
3 4 10000 10000
4 5 10 1