1 条题解
-
0
看了一下,怎么都是最短路啊?这题 bfs 可以轻松水过,蒟蒻就来发一篇 bfs 的题解吧。
题意:
给你一张无向图,让你求从 1 号节点在规定时间内可以到达的有牛的节点的数量以及牛的编号。
思路:
可以直接从一号节点进行 bfs,每次从队首弹出一个节点后便判断有没有牛在这个节点上,有就用一个 ans 数组存储起来,然后遍历与它相邻的节点,加入队列。最后 sort 排序一下再输出就好了。
注意:一个节点上可能有多只牛,所以每次出队时必须 遍历牛所在的位置。
代码:
因为 所以可以使用邻接矩阵存图。同时注意一下重边就好了。
代码如下:
#include<bits/stdc++.h> #define int long long using namespace std; const int MAXN = 510; int n , m , c , t; int mapp[MAXN][MAXN]; int area[MAXN]; int ans[MAXN]; int cnt; bool flag[MAXN]; inline void bfs() { queue<pair<int , int>>q; q.push(make_pair(1 , 0)); while(!q.empty()) { int u = q.front().first; int time = q.front().second; // cout << u << " "; q.pop(); if(flag[u]) continue; if(time > t) continue; flag[u] = true; for(int i = 1;i <= c;i ++) if(area[i] == u) ans[++ cnt] = i; //存答案 for(int i = 1;i <= n;i ++) if(i != u && mapp[u][i] != INT_MAX) //是否连通 q.push(make_pair(i , time + mapp[u][i])); } return; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> c >> t; for(int i = 1;i <= n;i ++) for(int j = 1;j <= n;j ++) if(i != j) mapp[i][j] = INT_MAX; for(int i = 1;i <= m;i ++) { int u , v , w; cin >> u >> v >> w; mapp[u][v] = min(mapp[u][v] , w); mapp[v][u] = min(mapp[v][u] , w); } for(int i = 1;i <= c;i ++) cin >> area[i]; bfs(); sort(ans + 1 , ans + 1 + cnt); cout << cnt << '\n'; for(int i = 1;i <= cnt;i ++) cout << ans[i] << '\n'; return 0; }
- 1
信息
- ID
- 2164
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者