一种新颖的暴力AC法(数据过水)
查看原帖
一种新颖的暴力AC法(数据过水)
802681
wangziyue_AK楼主2024/9/11 15:25

纯dfs,甚至不用dp,除了一个点外跑得飞快,那个点用一些奇特方法也可以卡过。

#include<bits/stdc++.h>
using namespace std;
typedef double db;
#define time (double)clock()/(double)CLOCKS_PER_SEC*1000.0
db st;
const int N=2e5+5;
int inf=4e8+5;
int n,m,a,b,c,f[N],ans=inf;
bool bj;
struct xx{
	int id,v,s,t; 
};
vector<xx> g[N];
void dfs(int u,int t,int x){
	if(time-st>600&&!bj){
	    bj=1;
		for(int i=1;i<=m;i++) f[i]=min(f[i],5000000);
	}
  //如要超时,手动剪枝,不加上面4行只能拿95pts
  //针对一些数据大但答案小的点设计
	//printf("000 %d %d %d\n",u,t,x);
	if(u==n){
		ans=min(ans,x+t);
		return;
	}
	for(xx it:g[u]){
		if(it.s<t) continue;
		int d=it.s-t;
		int k=x+a*d*d+b*d+c;
		if(f[it.id]<=k) continue;
		f[it.id]=k;
		dfs(it.v,it.t,k);
	}
}
int main(){
	st=time;
	scanf("%d%d%d%d%d",&n,&m,&a,&b,&c);
	int u,v,s,t;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&u,&v,&s,&t);
		g[u].push_back(xx{i,v,s,t});
		f[i]=inf;
	}
	dfs(1,0,0);
	printf("%d",ans);
	return 0;
}
2024/9/11 15:25
加载中...