dfs可过
查看原帖
dfs可过
479851
pujingcat楼主2021/9/11 16:19

思路供应者@dfsyyds

#include <bits/stdc++.h>
#define lll long long
#define rint register int
using namespace std;
struct ff { //empire
	vector <int> qx;
	vector <int> qw;
	vector <int> qt;
} ct[1001];
bool b[1001]= {0};
int n,m;
double ans=0.0,aaa,bbb;
void cheak(int a,int b) {
	double aa=double(a),bb=double(b);
	if(ans<=bb/aa){
		ans=bb/aa;
		aaa=aa,bbb=bb;
	} 
}
void dfs(int x,int sum,int mn) {
	if(aaa>0) if(mn*1000000/sum<=bbb*1000000/aaa) return;
	if(x==n) {
		cheak(sum,mn);
		return;
	}
	for(rint i=0; i<=ct[x].qx.size()-1; i++) {
		int xx=ct[x].qx[i];
		//cout<<xx<<endl;
		if(b[xx]==0) {
			b[xx]=1;
			dfs(xx,sum+ct[x].qw[i],min(mn,ct[x].qt[i]));
			b[xx]=0;
		}
	}
}
int main() {
	scanf("%d%d",&n,&m);
	for(rint i=1; i<=m; i++) {
		rint u,v,w,t;
		scanf("%d%d%d%d",&u,&v,&w,&t);
		ct[u].qx.push_back(v);
		ct[u].qw.push_back(w);
		ct[u].qt.push_back(t);
		ct[v].qx.push_back(u);
		ct[v].qw.push_back(w);
		ct[v].qt.push_back(t);
	}
	b[1]=1;
	dfs(1,0,0x3f3f3f3f);
	ans*=1000000.0;
	int pp=int(ans);
	printf("%d",pp);
	return 0;
}

朴素的dfs,只是加了dfs函数的第一行的剪枝。

我都不敢相信这种剪枝不开O2能A!!!!! 而且剩余时间非常充裕

2021/9/11 16:19
加载中...