CSPJ T4 小兔零100 洛谷90求调
  • 板块学术版
  • 楼主LiaoYF1
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/21 19:41
  • 上次更新2023/11/2 12:11:24
查看原帖
CSPJ T4 小兔零100 洛谷90求调
633466
LiaoYF1楼主2023/10/21 19:41
#include<iostream>
#include<queue>
#include<cstring>
#define int long long
using namespace std;
int n,m,k,head[20005],nxt[20005],to[20005],cnt,dis[10005][105],a[20005],maxa;
void add(int u,int v,int w){
    to[++cnt]=v;
    nxt[cnt]=head[u];
    a[cnt]=w;
    head[u]=cnt;
}
struct node{
    int id,dis,mod;
};
int solve(int x){
    queue<node> q;
    q.push((node){1,x,0});
    memset(dis,-1,sizeof(dis));
    dis[1][0]=x;
    while(!q.empty()){
        int u=q.front().id,x=q.front().mod;
        q.pop();
        for(int i=head[u];i;i=nxt[i]){
            int v=to[i];
            if(dis[u][x]>=a[i]&&dis[v][(x+1)%k]==-1){
                dis[v][(x+1)%k]=dis[u][x]+1;
                q.push((node){v,dis[u][x]+1,(x+1)%k});
            }
        }
    }
    return dis[n][0];
}
signed main(){
    //freopen("bus.in","r",stdin);
    //freopen("bus.out","w",stdout);
    cin>>n>>m>>k;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        maxa=max(maxa,w);
        add(u,v,w);
    }
    int l=0,r=maxa/k+1;
    int minn=-1;
    while(l<=r){
        int mid=(l+r)/2;
        int x=solve(mid*k);
        if(x!=-1){
            r=mid-1;
            minn=x;
        }else{
            l=mid+1;
        }
    }
    cout<<minn;
    return 0;
}

思路:二分+bfs

2023/10/21 19:41
加载中...