社区讨论
救救孩子吧 , 对拍了好几万组数据也没拍出来
P1266速度限制参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo2b7xkc
- 此快照首次捕获于
- 2023/10/23 11:00 2 年前
- 此快照最后确认于
- 2023/11/03 11:09 2 年前
- RT
#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 条回复,欢迎继续交流。
正在加载回复...