求助P4880 50分
  • 板块P4880 抓住czx
  • 楼主Cure_Wing
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/8/20 08:58
  • 上次更新2023/10/27 14:30:29
查看原帖
求助P4880 50分
394167
Cure_Wing楼主2022/8/20 08:58

正如题目所说的那样:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<bitset>
#include<queue>
using std::cin;using std::cout;
constexpr int N=500010,inf=0x7fffffff;
int n,m,b,e,head[N/5],then[N<<1],to[N<<1],way[N<<1],dis[N<<1],cnt,u,v,w,t,Dis[2][N/5][111],ans=inf;
struct node{
    int a,x;
    inline void scan(){
        cin>>a>>x;
    }
}f[N/5];
inline void add(int x,int y,int z){
    to[++cnt]=y;
    way[cnt]=z;
    then[cnt]=head[x];
    head[x]=cnt;
}
inline void SPFA(int st){
    std::bitset<N>vis;
    std::queue<int>q;
    q.push(st);
    vis[st]=1;
    dis[st]=0;
    while(!q.empty()){
        int k=q.front();q.pop();
        for(int i=head[k];i;i=then[i]){
            int j=to[i],l=way[i];
            if(dis[k]+l<dis[j]){
                dis[j]=dis[k]+l;
                if(!vis[j]) q.push(j),vis[j]=1;
            }
        }
    }
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
    cin>>n>>m>>b>>e;
    for(int i=1;i<=m;++i){
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    cin>>t;
    for(int i=1;i<=t;++i) f[i].scan();
    std::sort(f+1,f+t+1,[](node a,node b){return a.a<b.a;});
    for(int i=1;i<=n;++i) dis[i]=inf;
    Dis[0][f[0].x=e][++Dis[0][f[0].x][0]]=0;
    for(int i=1;i<=t;++i){
        Dis[1][f[i-1].x][++Dis[1][f[i-1].x][0]]=f[i].a;
        Dis[0][f[i].x][++Dis[0][f[i].x][0]]=f[i].a;
    }
    Dis[1][f[t].x][++Dis[1][f[t].x][0]]=inf;
    SPFA(b);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=Dis[0][i][0];++j)
            if(dis[i]<Dis[1][i][j])
                ans=std::min(std::max(dis[i],Dis[0][i][j]),ans);
    }
    cout<<ans<<'\n';
    return 0;
}
2022/8/20 08:58
加载中...