• Codefroces 366 D Dima and Trap Graph (最短路)


    Dima and Trap Graph

    题意:Dima和Inna越来越喜欢对方,但是Dima的室友缺很没有热情出去玩,然后Dima就把他室友Seryozha骗进了陷阱里。现在Seryozha想要从陷阱里出来,每条路上有一个l,r, Seryozha在走路前可以选择一个X,然后每次通过一条路的时候都需要满足条件 l <= x <= r, 每次选定了一个X之后,这个X是一个定值,不会乱变,现求这样的X的数目一共有多少,如果为0就输出“Nick work Dima!”,不然就输出数目。

    题解:在每个点开一个set,存一下每次访问到这个点的时候的左区间,右区间,如果访问过了,那就不需要再走了,因为结果肯定不会比完全覆盖的更优,当然如果现在的长度已经小于等于ans的长度了,那么也不再需要再走了,就算接下来的路都不限制区间,那么也不可能比答案更优。

     1 #include<iostream>
     2 #include<vector>
     3 #include<set>
     4 #include<queue>
     5 #include<cstring>
     6 using namespace std;
     7 const int INF = 0x3f3f3f3f;
     8 const int N = 1e3+5;
     9 typedef pair<int, int> pll;
    10 struct Node
    11 {
    12     int  b, l, r;
    13 }tmp;
    14 vector<Node> edge[N];
    15 set<pll> len[N];
    16 int n, m, ans = 0;
    17 void Add_edge(int a, int b, int l, int r)
    18 {
    19     tmp.b = b;
    20     tmp.l = l, tmp.r = r;
    21     edge[a].push_back(tmp);
    22 }
    23 void solve()
    24 {
    25     queue<Node> q;
    26     tmp.b = 1, tmp.l = 0, tmp.r = INF;
    27     q.push(tmp);
    28     set<pll>::iterator it;
    29     while(!q.empty())
    30     {
    31         tmp = q.front();
    32         q.pop();
    33         int id = tmp.b;
    34         int l = tmp.l, r = tmp.r;
    35         if(id == n)
    36         {
    37             ans = max(ans, r-l+1);
    38             continue;
    39         }
    40         if(r-l+1 <= ans) continue;
    41         for(int i = 0; i < edge[id].size(); i++)
    42         {
    43             int ll = max(l, edge[id][i].l);
    44             int rr = min(r, edge[id][i].r);
    45             int t = edge[id][i].b;
    46             if(ll > rr) continue;
    47             bool flag = 0;
    48             for(it = len[t].begin(); it != len[t].end(); it++)
    49             {
    50                  if((*it).first <= ll && (*it).second >= rr)
    51                  {
    52                      flag = 1;
    53                      break;
    54                  }
    55             }
    56             if(flag) continue;
    57             len[t].insert(pll(ll,rr));
    58             tmp.b = t;
    59             tmp.l = ll;
    60             tmp.r = rr;
    61             q.push(tmp);
    62         }
    63     }
    64 }
    65 int main()
    66 {
    67     ios::sync_with_stdio(false);
    68     cin.tie(0);
    69     cout.tie(0);
    70     int a, b, l, r;
    71     cin >> n >> m;
    72     for(int i = 1; i <= m; i++)
    73         {
    74             cin >> a >> b >> l >> r;
    75             Add_edge(a,b,l,r);
    76             Add_edge(b,a,l,r);
    77         }
    78     solve();
    79     if(ans == 0) cout << "Nice work, Dima!
    ";
    80     else cout << ans << endl;
    81     return 0;
    82 }
  • 相关阅读:
    idea 导入maven项目各种红
    基于 Spring Security 的开源统一角色访问控制系统 URACS
    MySQL读写分离又一好办法 使用 com.mysql.jdbc.ReplicationDriver
    [转]CVS SVN VSS 使用对比
    推荐一个免费开源的虚拟机VBox(VirtualBox)
    JavaScript的对象属性的反射
    [转]需求分析的目的
    尝鲜安装iOS6及新特性
    EXP00003: 未找到段 (4,571) 的存储定义
    QQ邮箱里可以定阅博客园的文章了
  • 原文地址:https://www.cnblogs.com/MingSD/p/8426861.html
Copyright © 2020-2023  润新知