2 条题解

  • 0
    @ 2025-3-16 1:47:07
    //奶牛跨栏
    //https://dashoj.com/p/141
    //dijkstra+图+邻接表+求瓶颈最短路的最小值
    #include <bits/stdc++.h>
    
    using namespace std;
    using pi = pair<int,int>;
    
    const int N = 301;
    const int INF = 0x3f3f3f3f;
    
    struct node{
    	int v;
    	int dis;
    	bool operator < (const node & a) const{
    		return dis > a.dis;
    	}
    };
    
    vector<pi> adj[N];
    int dist[N][N];//起点到终点的最短路 ,也充当记忆数组
    bool flag[N];//是否在S中 
    
    void dijkstra(int u){
    	priority_queue<node> pq;
    	for(int i = 0;i < N;i++){
    		dist[u][i] = INF; 
    	} 
    	dist[u][u] = 0;
    	pq.push({u,0});	
    	memset(flag, 0, sizeof(flag));//必要,不然会出bug 
    	while(!pq.empty()){
    		node it = pq.top();
    		pq.pop();
    		int t = it.v;
    		if(flag[t]){
    			continue;
    		}
    		flag[t] = true;
    		for(auto edge : adj[t]){
    			int i = edge.first;
    			int w = edge.second;
    			if(!flag[i] && dist[u][i] > max(dist[u][t],w)){
    				dist[u][i] = max(dist[u][t],w);
    				pq.push({i,dist[u][i]});
    			} 
    		}
    	}
    }
    
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        
    	int n,m,t;
    	int s,e,h;
    	cin >> n >> m >> t;
    	while(m--){
    		cin >> s >> e >> h;
    		adj[s].push_back({e,h});
    	}
    	
    	for (int i = 0; i < N; i++) {
        	for (int j = 0; j < N; j++) {
            	dist[i][j] = INF;
        	}
    	}
    	
    	while(t--){
    		int st,et;
    		cin >> st >> et;
    		int& res = dist[st][et];
    		if(res != INF){
    			cout << res << "\n";
    			continue;
    		}
    		dijkstra(st);
    		
    		if(res == INF){
    			cout << -1 << "\n";
    		}else{
    			cout << res << "\n";
    		}
    	}
    	return 0;
    }
    

    信息

    ID
    141
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    45
    已通过
    9
    上传者