• 洛谷 P4880 抓住czx


    水题,只需要枚举可能抓住czx的点,找出抓住的最小时间即可

    需要用lty到达czx所在位置的最小时间,一遍dijkstra即可

    注意,需要开long long 和特判t=0的情况

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<algorithm>
    #define int long long
    using namespace std;
    const int maxn=1e5+10;
    const int inf =0x3f3f3f3f;
    inline int read(){
    	int ret=0;
    	int f=1;
    	char ch=getchar();
    	while(ch<'0'||ch>'9'){
    		if(ch=='-')
    			f=-f;
    		ch=getchar();
    	}
    	while(ch<='9'&&ch>='0'){
    		ret=ret*10+(ch^'0');
    		ch=getchar();
    	}
    	return f*ret;
    }
    struct edge{
    	int nex;
    	int to;
    	int w;
    }e[maxn*10+10];
    int head[maxn*10+10];
    int cnt;
    struct node{
    	int s,d;
    	bool operator < (const node &x) const {
    		return d>x.d;
    	}
    };
    void add(int u,int v,int w){
    	cnt++;
    	e[cnt].nex=head[u];
    	e[cnt].to=v;
    	e[cnt].w=w;
    	head[u]=cnt;
    } 
    int n,m,b,o;
    int dis[maxn];
    void dist(int s){
    	for(int i=1;i<=n;i++){
    		dis[i]=inf;
    	}
    	dis[s]=0;
    	priority_queue<node>q;
    	q.push((node){s,dis[s]});
    	while(!q.empty()){
    		node f=q.top();
    		q.pop();
    		int u=f.s;
    		int d=f.d;
    		if(dis[u]!=d) {
    			continue; 
    		}
    		for(int i=head[u];i;i=e[i].nex){
    			int y=e[i].to;
    			if(dis[y]>dis[u]+e[i].w){
    				dis[y]=dis[u]+e[i].w;
    				q.push((node){y,dis[y]});
    			}
    		}
    	}	
    		return ;
    }
    int t;
    struct pos{
    	int t;
    	int p;
    }a[maxn];
    bool cmp(pos x,pos y){
    	return x.t<y.t;
    }
    signed main(){
    //	freopen("a.in","r",stdin);
    	n=read();
    	m=read();
    	b=read();
    	o=read();
    	int x,y,w;
    	for(int i=1;i<=m;i++){
    		x=read();
    		y=read();
    		w=read(); 
    		add(x,y,w);
    		add(y,x,w);
    	}
    	dist(b);
    	t=read();
    	if(!t){
    		cout<<dis[o]<<endl;
    		return 0;
    	}
    	for(int i=1;i<=t;i++){
    		a[i].t=read();
    		a[i].p=read();	
    	}
    	sort(a+1,a+1+t,cmp);
    	int ans=inf;
    	if(dis[o]<a[1].t){
    		ans=min(ans,dis[o]);
    	}
    	for(int i=1;i<=t;i++){
    		int p=a[i].p;
    		int tt=a[i].t;
    		if(dis[p]<tt){
    			ans=min(ans,tt);
    		}
    		else {
    			if(dis[p]>=tt&&(dis[p]<a[i+1].t||i==t)){
    				ans=min(ans,dis[p]);
    			}
    		}
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    怎么知道银行卡号对应的银行
    集合排序、map、枚举
    669. Trim a Binary Search Tree修剪二叉搜索树
    17. Merge Two Binary Trees 融合二叉树
    226. Invert Binary Tree 翻转二叉树
    530.Minimum Absolute Difference in BST 二叉搜索树中的最小差的绝对值
    191. Number of 1 Bits 二进制中1的个数
    Hamming Distance二进制距离
    136. Single Number唯一的数字
    276. Paint Fence篱笆涂色
  • 原文地址:https://www.cnblogs.com/rpup/p/14032405.html
Copyright © 2020-2023  润新知