打了一个最大生成树+dfs,60分成功tle

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 10005;
  4. const int maxm = 50005;
  5. int n, m, cnt = 0;
  6. struct edge
  7. {
  8. int from, to, value;
  9. bool operator < (const edge b) const {
  10. return this->value > b.value;
  11. }
  12. }es[maxm];
  13. vector<edge> G[maxn];
  14. struct car
  15. {
  16. int from, to;
  17. }cs[30001];
  18. int q;
  19. void read() {
  20. cin >> n >> m;
  21. for(int i = 1; i <= m; i++) {
  22. int x, y, z;
  23. cin >> x >> y >> z;
  24. es[cnt].from = x;
  25. es[cnt].to = y;
  26. es[cnt].value = z;
  27. cnt++;
  28. }
  29. cin >> q;
  30. for(int i = 1; i <= q; i++) cin >> cs[i].from >> cs[i].to;
  31. }
  32. int fa[maxn];
  33. int find(int x) {
  34. return x == fa[x] ? x : fa[x] = find(fa[x]);
  35. }
  36. void kruskal() {
  37. sort(es, es+cnt);
  38. for(int i = 1; i <= n; i++) fa[i] = i;
  39. for(int i = 0; i < cnt; i++) {
  40. int x = es[i].from; int y = es[i].to;
  41. int fx = find(x); int fy = find(y);
  42. if(fx == fy) {
  43. es[i].value = -1;
  44. continue;
  45. }
  46. else fa[fx] = fy;
  47. }
  48. }
  49. void build_tree() {
  50. sort(es, es+cnt);
  51. for(int i = 0; i < cnt; i++) {
  52. if(es[i].value != -1) {
  53. int x = es[i].from;
  54. int y = es[i].to;
  55. G[x].push_back({x, y, es[i].value});
  56. G[y].push_back({y, x, es[i].value});
  57. }
  58. else break;
  59. }
  60. }
  61. int mini = 0x3f3f3f;
  62. int vis[maxn];
  63. void dfs(int from, int to, int m) {
  64. vis[from] = 1;
  65. if(from == to) {mini = m; return;}
  66. vector<edge>::iterator it;
  67. for(it = G[from].begin(); it != G[from].end(); it++) {
  68. edge &e = *it;
  69. if(!vis[e.to]) {
  70. dfs(e.to, to, min(m, e.value));
  71. }
  72. }
  73. }
  74. void solve() {
  75. for(int i = 1; i <= q; i++) {
  76. int x = cs[i].from;
  77. int y = cs[i].to;
  78. mini = 0x3f3f3f;
  79. memset(vis, 0, sizeof(vis));
  80. dfs(x, y, 0x3f3f3f);
  81. if(mini == 0x3f3f3f) cout << -1;
  82. else cout << mini;
  83. cout << endl;
  84. }
  85. }
  86. int main() {
  87. // freopen("input.in", "r", stdin);
  88. read();
  89. kruskal();
  90. build_tree();
  91. solve();
  92. return 0;
  93. }

P1967 货车运输 -60分的更多相关文章

  1. 洛谷 P1967 货车运输

    洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...

  2. Luogu P1967 货车运输(Kruskal重构树)

    P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...

  3. P1967 货车运输

    P1967 货车运输最大生成树+lca+并查集 #include<iostream> #include<cstdio> #include<queue> #inclu ...

  4. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  5. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  6. P1967 货车运输(倍增LCA,生成树)

    题目链接: https://www.luogu.org/problemnew/show/P1967 题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制, ...

  7. 洛谷 P1967 货车运输 Label: 倍增LCA && 最小瓶颈路

    题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...

  8. 洛谷 P1967 货车运输(克鲁斯卡尔重构树)

    题目描述 AAA国有nn n座城市,编号从 11 1到n nn,城市之间有 mmm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qqq 辆货车在运输货物, 司机们想知道每辆车在不超过车 ...

  9. P1967 货车运输 树链剖分

    题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...

随机推荐

  1. JavaScript无缝滚动

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. three.js 显示一条线

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. oracle的内置函数

    1.wmsys.wm_concat   行转列函数 select wmsys.wm_concat(destnumber) from mms_send_his_record group by sendn ...

  4. unity awake start 的区别

    void Awake (){ } //初始化函数,在游戏开始时系统自动调用.一般用来创建变量之类的东西. void Start(){ } //初始化函数,在所有Awake函数运行完之后(一般是这样,但 ...

  5. Theano深度学习结构分析

    Reference:Theano入门三部曲 http://deeplearning.net/tutorial/logreg.html  (Softmax回归) http://deeplearning. ...

  6. Android 在线更新apk

    1.获取当前包的信息: 1 PackageManager manager = Main.this.getPackageManager(); 2 try { 3 PackageInfo info = m ...

  7. ios 关于[xxx timeIntervalSinceNow]出现EXC_BAD_ACCESS错误的解决办法

    [xxx timeIntervalSinceNow]出现EXC_BAD_ACCESS错误的主要原因是之前的[NSDate date]返回一个autoreleased的NSdata,其被释放掉 解决方法 ...

  8. AngularJS的Filter用法详解

    上一篇讲了自定义Directive,本篇是要讲到AngularJS的Filter. Filter简介 Filter是用来格式化数据用的. Filter的基本原型( '|' 类似于Linux中的管道模式 ...

  9. BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

    一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...

  10. 数组的Clone方法

    public void Test() { ,,}; var arr2 = arr1; var arr3 = (int[])arr1.Clone(); //浅拷贝 arr1[] = ; //arr2[0 ...