搜索
热搜: NOIP OIer 神牛
查看: 353|回复: 1

2160 农场派对

[复制链接]

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2021-6-14 09:39:10 | 显示全部楼层 |阅读模式
1 + 2 = 3
2 + 3 = 11
3 + 3 = 12
1 + 3 + 3 = 13

回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2021-6-14 10:20:08 | 显示全部楼层
First:2160
首先,我们要读题:
N(1N1000)头牛要去参加一场在编号为x1xN)的牛的农场举行的派对。有M1M100000)条有向道路,每条路长Ti1Ti100);每头牛都必须参加完派对后回到家,每头牛都会选择最短路径。求这N头牛的最短路径(一个来回)中最长的一条的长度。特别提醒:可能有权值不同的重边
喔,一看,模板题!
但是,这题有一个大坑点:
有向道路
也就是说,去时的路不一定是回来的路


Second:举例


如上图,假如说所有人都到3去
那2号就直接去了,但回不来了
So,这道题需要两次DJI
一次是所有点到s的距离,一次是s到所有点的距离


Third:code
  1. /*
  2. ID: jian8281
  3. TASK: test
  4. LANG: C++
  5. */
  6. #include<cstring>
  7. #include<cmath>
  8. #include<cstdio>
  9. #include<cstdlib>
  10. #include<algorithm>
  11. #include<iomanip>
  12. #include<string>
  13. #include<queue>
  14. #include<iostream>
  15. using namespace std;

  16. #define REP(i,k,n)  for(int i=k;i<=n;i++)
  17. #define MAXN 100010

  18. int n, m, s, ans = -2147483647;
  19. int total1, head1[MAXN], to1[MAXN], nxt1[MAXN], val1[MAXN];
  20. int total2, head2[MAXN], to2[MAXN], nxt2[MAXN], val2[MAXN];
  21. int dis1[MAXN];
  22. bool vis1[MAXN];
  23. int dis2[MAXN];
  24. bool vis2[MAXN];

  25. struct node
  26. {
  27.     int a;
  28.     int b;
  29. };

  30. priority_queue<node> q;

  31. bool operator < (node x,node y
  32. ){
  33.     return x.b > y.b;
  34. }

  35. void aadd(int a, int b, int c)
  36. {
  37.     total1++;
  38.     to1[total1] = b;
  39.     val1[total1] = c;
  40.     nxt1[total1] = head1[a];
  41.     head1[a] = total1;
  42.     return;
  43. }

  44. void addd(int a,int b,int c)
  45. {
  46.     total2++;
  47.     to2[total2] = b;
  48.     val2[total2] = c;
  49.     nxt2[total2] = head2[a];
  50.     head2[a] = total2;
  51.     return;
  52. }

  53. void dijkstra1()
  54. {
  55.     dis1[s] = 0;
  56.      
  57.     q.push(node{s, 0});
  58.      
  59.     while(!q.empty())
  60.     {
  61.         int u = q.top().a;
  62.          
  63.         q.pop();
  64.          
  65.         if(vis1[u])  
  66.         {
  67.             continue;
  68.         }
  69.          
  70.         vis1[u] = true;
  71.          
  72.         for(int e = head1[u];e;e = nxt1[e])
  73.         {
  74.             if(dis1[to1[e]] > dis1[u] + val1[e])
  75.             {
  76.                 dis1[to1[e]] = dis1[u] + val1[e];
  77.                 q.push(node{to1[e], dis1[to1[e]]});
  78.             }
  79.         }   
  80.     }
  81.      
  82.     return;
  83. }

  84. void dijkstra2()
  85. {
  86.     dis2[s] = 0;
  87.      
  88.     q.push(node{s, 0});
  89.      
  90.     while(!q.empty())
  91.     {
  92.         int u = q.top().a;
  93.          
  94.         q.pop();
  95.          
  96.         if(vis2[u])  
  97.         {
  98.             continue;
  99.         }
  100.          
  101.         vis2[u] = true;
  102.          
  103.         for(int e = head2[u];e;e = nxt2[e])
  104.         {
  105.             if(dis2[to2[e]] >  dis2[u] + val2[e])
  106.             {
  107.                 dis2[to2[e]] = dis2[u] + val2[e];
  108.                 q.push(node{to2[e], dis2[to2[e]]});
  109.             }
  110.         }
  111.     }
  112.      
  113.     return;
  114. }

  115. int main()
  116. {
  117.     cin >> n >> m >> s;
  118.      
  119.     int a, b, c;
  120.      
  121.     for(int i = 1;i <= m;++i)
  122.     {
  123.         cin>> a >> b >> c;
  124.         aadd(a, b, c);
  125.         addd(b, a, c);
  126.     }
  127.      
  128.     for(int i = 1;i <= n;++i)
  129.     {
  130.         dis1[i] = dis2[i] = 2147483647;
  131.     }
  132.      
  133.     dijkstra1();
  134.     dijkstra2();
  135.      
  136.     for(int i = 1;i <= n;++i)
  137.     {
  138.         ans = max(ans, dis1[i] + dis2[i]);
  139.     }
  140.      
  141.     cout << ans;
  142. }
复制代码


caidan














































































































1.0亿

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表