CSP2023-J-4-旅游巴士 TLE35分求调

题目不用贴了吧

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
const int maxm=2e4+5;
const int maxk=1e2+5;
const int inf=1e7;
struct edge{
  int to,next,w;
};
int n,m,k,u,v,w,cnt;
int head[maxn*maxk];
edge e[maxm*maxk];
void add_edge(int u,int v,int w){
  e[++cnt].to=v;
  e[cnt].next=head[u];
  e[cnt].w=w;
  head[u]=cnt;
}
queue<int> q;
int dis[maxn * maxk];
void bfs(int d){
  memset(dis,-0x3f,sizeof(dis));
  q.push(n);
  dis[n]=d;
  while(!q.empty()){
    int v=q.front();
    q.pop();
    for(int i=head[v];i;i=e[i].next){
      int u=e[i].to;
      if(dis[v]>e[i].w&&dis[u]==dis[0]){
        dis[u]=dis[v]-1;
        q.push(u);
      }
    }
  }
}
int main(){
  freopen("bus.in","r",stdin);
  freopen("bus.out","w",stdout);
  scanf("%d%d%d",&n,&m,&k);
  for(int i=1;i<=m;i++){
    scanf("%d%d%d",&u,&v,&w);
	for(int j=0;j<k-1;j++){
      add_edge(v+(j+1)*n,u+j*n,w);
      add_edge(v,u+(k-1)*n,w);
    }
  }
  bfs(inf);
  if(dis[1]<0){
    printf("-1");
    return 0;
  }
  int l=0,r=inf;
  while(l<r){
	int mid=(l+r)>>1;
	bfs(mid);
	if(dis[1]>=0) r=mid;
	else l=mid+1;
  }
  bfs(l);
  printf("%d",l+(dis[1]+k-1)/k*k-dis[1]); 
  return 0;
}

https://www.luogu.com.cn/problem/P9751

还是贴一下好

我康康

你怎么二分上了?

需要二分吗,建议看一下二分写对没

你写的好奇怪,不需要二分啊

我也觉得不用

maxn*maxk
你这不是爆空间了吗?

为什么要从INF开始bfs呢?

这个没报空间吧,10e6还可以的

哦哦哦,是我眼瞎,不会MLE

但这个二分好像没有单调性

哥啊!你就直接从1开始bfs,q保存的是3个值:当前点,状态(模k的余数),时间。采用Dijkstra算法。最后看dis[n][0]即到达n点状态为0的时间,如果大于等于初始赋值的极大值,那么就是到不了,输出-1;反之,输出dis[n][0]

A了吗?

早就A了

啥时候

解决方案给谁?

放假的时候

给我自己(

:rage:()

你看看这个