社区讨论

救救孩子吧 , 对拍了好几万组数据也没拍出来

P1266速度限制参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo2b7xkc
此快照首次捕获于
2023/10/23 11:00
2 年前
此快照最后确认于
2023/11/03 11:09
2 年前
查看原帖
  • RT
CPP
#include<bits/stdc++.h>
#define double long double
using namespace std;
int n,m,d,f[2001],s,color[2001],fc[2011],colorp[2001][2001];
int road[1502][1502],le[1502][1502];
vector<int>a[2001],b[2001];
vector<double>v[2001],l[2001];
priority_queue< pair<double,int> >q,p;
//queue<int>q;
double vold[2001],dis[2001];
vector<int>pr[2001],prnow;
void End(int x,double y,double t,int fi){
	if(colorp[fi][x]) return;
	prnow.push_back(x);
	for(int i=0;i<a[x].size();i++){
		int To=a[x][i];
		double T,val=v[x][i],len=l[x][i];
		T=len/y;
		colorp[fi][x]=1;
		if(!val){
			if(dis[To]>T+t){
				dis[To]=t+T;
				f[To]=fi;fc[To]=1;
				while(!pr[To].empty()) pr[To].pop_back();
				for(int j=0;j<prnow.size();j++)
					pr[To].push_back(prnow[j]);
			//	if(!color[To]){
					//q.push(To);
					q.push(make_pair(-dis[To],To));
				//	color[To]=1;
			//	} 
			}
			End(To,y,t+T,fi);
		}
	}
	prnow.pop_back();
	return;
}

void Find(){
//	for(int i=1;i<=n;i++) f[i]=-1;
	for(int i=1;i<=n;i++) dis[i]=2e9;
//	printf("%.4lf",dis[2]);
	dis[s]=0;
//	q.push(s);
	q.push(make_pair(0,s));
	End(s,70,0,0);
	do{
		int now=q.top().second;q.pop();
		color[now]=0;
		for(int j=0;j<a[now].size();j++){
			
			int To=a[now][j];
			double len=l[now][j],val=v[now][j];
			double T=len/val;
			
		//	cout<<"To:"<<To<<" "<<dis[To]<<" "<<dis[now]<<" "<<T<<endl;
		
			if(dis[To]>dis[now]+T&&val){
				dis[To]=dis[now]+T;
				f[To]=now;fc[To]=0;
				vold[To]=val;
			//	if(!color[To]){
					q.push(make_pair(-dis[To],To));
			//		color[To]=1;
			//	} 
			}
			
			End(To,val,dis[now]+T,now);
			
		}
	}while(!q.empty());
	return;
}
void ST(int x){
//	cout<<f[x]<<" "<<x<<endl;
	if(!x) return;
	ST(f[x]);	
	if(fc[x]){
		for(int i=pr[x].size()-1;i>=0;i--){
			if(pr[x][i]!=f[x]&&pr[x][i])
				printf("%d ",pr[x][i]);	
		}
	}
	printf("%d ",x);
	return;
}
int main(){
//	freopen("Random.out","r",stdin);
//	freopen("bf.out","w",stdout);
	scanf("%d %d %d",&n,&m,&d);
	for(int i=1;i<=m;i++){
		int w,x,y,z;
		scanf("%d %d %d %d",&w,&x,&y,&z);
		a[w].push_back(x);
		v[w].push_back(y);
		l[w].push_back(z);
	}
	s=0;
	Find();
/*	
	for(int i=0;i<n;i++) cout<<dis[i]<<" ";
	cout<<endl;
//	for(int i=0;i<n;i++) cout<<f[i]<<" ";
//	cout<<endl;
	for(int i=0;i<n;i++) cout<<fc[i]<<" ";
	cout<<endl;
	for(int i=0;i<n;i++){
		cout<<i<<" "<<f[i]<<" : ";
		for(int j=0;j<pr[i].size();j++){
			cout<<pr[i][j]<<" ";
		}
		cout<<endl;
	}
	*/
	printf("0 ");
	ST(d);
	printf("\n");
//	cout<<dis[d]<<endl;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...