继续Hack
查看原帖
继续Hack
253527
GuideZombies楼主2021/7/14 20:13

虽然第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
2021/7/14 20:13
加载中...