1 solutions

  • 0
    @ 2024-12-11 0:49:56

    C++ :

    #include<cstdio>
    #include<queue>
    #include<cstring>
    #define MAXK 10001
    #define MAXN 1001
    #define INF 10000001
    using namespace std;
    struct edge{
    	int to;
    	int data;
    	int next;
    }e[MAXK<<1];
    int n,p,k,len,g[MAXN],dis[MAXN];
    bool v[MAXN];
    queue<int> q;
    void make_edge(int x,int y,int data){
    	len++;
    	e[len].to=y;
    	e[len].data=data;
    	e[len].next=g[x];
    	g[x]=len;
    	return;
    }
    bool SPFA(int);
    int main(){
    	scanf("%d%d%d",&n,&p,&k);
    	for(int i=1;i<=p;i++){
    		int x,y,l;
    		scanf("%d%d%d",&x,&y,&l);
    		make_edge(x,y,l);
    		make_edge(y,x,l);
    	}
    	int l=0,r=INF,ans=INF;
    	while(l<=r){
    		int mid=(l+r)>>1;
    		bool flag=SPFA(mid);
    		if(flag){
    			if(ans>mid) ans=mid;
    			r=mid-1;
    		}
    		else l=mid+1;
    	}
    	if(ans==INF) ans=-1;
    	printf("%d\n",ans);
    	return 0;
    }
    bool SPFA(int lim){
    	memset(dis,0x7f,sizeof(dis));
    	memset(v,0,sizeof(v));
    	v[1]=1;
    	dis[1]=0;
    	q.push(1);
    	while(!q.empty()){
    		int k=q.front();
    		v[k]=0;
    		q.pop();
    		for(int i=g[k];i!=0;i=e[i].next){
    			int y=e[i].to,val=e[i].data;
    			int add=0;
    			if(val>lim) add=1;
    			if(dis[y]>dis[k]+add){
    				dis[y]=dis[k]+add;
    				if(!v[y]){
    					v[y]=1;
    					q.push(y);				
    				}
    			}
    		}
    	}
    	if(dis[n]<=k) return 1;
    	return 0;
    }
    
    • 1

    Information

    ID
    760
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By