2 条题解
-
0
//奶牛跨栏 //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
- 上传者