• ACM-ICPC (10/20)


    B. Bakery
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Masha wants to open her own bakery and bake muffins in one of the n cities numbered from 1 to n. There are m bidirectional roads, each of whose connects some pair of cities.

    To bake muffins in her bakery, Masha needs to establish flour supply from some storage. There are only k storages, located in different cities numbered a1, a2, ..., ak.

    Unforunately the law of the country Masha lives in prohibits opening bakery in any of the cities which has storage located in it. She can open it only in one of another n - k cities, and, of course, flour delivery should be paid — for every kilometer of path between storage and bakery Masha should pay 1 ruble.

    Formally, Masha will pay x roubles, if she will open the bakery in some city b (ai ≠ b for every 1 ≤ i ≤ k) and choose a storage in some city s (s = aj for some 1 ≤ j ≤ k) and b and s are connected by some path of roads of summary length x (if there are more than one path, Masha is able to choose which of them should be used).

    Masha is very thrifty and rational. She is interested in a city, where she can open her bakery (and choose one of k storages and one of the paths between city with bakery and city with storage) and pay minimum possible amount of rubles for flour delivery. Please help Masha find this amount.

    Input

    The first line of the input contains three integers nm and k (1 ≤ n, m ≤ 105, 0 ≤ k ≤ n) — the number of cities in country Masha lives in, the number of roads between them and the number of flour storages respectively.

    Then m lines follow. Each of them contains three integers uv and l (1 ≤ u, v ≤ n1 ≤ l ≤ 109, u ≠ v) meaning that there is a road between cities u and v of length of l kilometers .

    If k > 0, then the last line of the input contains k distinct integers a1, a2, ..., ak (1 ≤ ai ≤ n) — the number of cities having flour storage located in. If k = 0 then this line is not presented in the input.

    Output

    Print the minimum possible amount of rubles Masha should pay for flour delivery in the only line.

    If the bakery can not be opened (while satisfying conditions) in any of the n cities, print  - 1 in the only line.

    Examples
    input
    5 4 2
    1 2 5
    1 2 3
    2 3 4
    1 4 10
    1 5
    output
    3
    input
    3 1 1
    1 2 3
    3
    output
    -1
    Note

    Image illustrates the first sample case. Cities with storage located in and the road representing the answer are darkened.

     

    题意:看懂题意就行了,有一些面粉厂,从其他的点到其中一个面粉厂最短路。

    分析:

    暴力扫边的题,活生生的被我建图成了迪杰斯特拉。其实也是仿照了网络流的姿势。

     

    CF721C

    C. Journey
    time limit per test
    3 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Recently Irina arrived to one of the most famous cities of Berland — the Berlatov city. There are n showplaces in the city, numbered from 1to n, and some of them are connected by one-directional roads. The roads in Berlatov are designed in a way such that there are no cyclic routes between showplaces.

    Initially Irina stands at the showplace 1, and the endpoint of her journey is the showplace n. Naturally, Irina wants to visit as much showplaces as she can during her journey. However, Irina's stay in Berlatov is limited and she can't be there for more than T time units.

    Help Irina determine how many showplaces she may visit during her journey from showplace 1 to showplace n within a time not exceeding T. It is guaranteed that there is at least one route from showplace 1 to showplace n such that Irina will spend no more than T time units passing it.

    Input

    The first line of the input contains three integers n, m and T (2 ≤ n ≤ 5000,  1 ≤ m ≤ 5000,  1 ≤ T ≤ 109) — the number of showplaces, the number of roads between them and the time of Irina's stay in Berlatov respectively.

    The next m lines describes roads in Berlatov. i-th of them contains 3 integers ui, vi, ti (1 ≤ ui, vi ≤ n, ui ≠ vi, 1 ≤ ti ≤ 109), meaning that there is a road starting from showplace ui and leading to showplace vi, and Irina spends ti time units to pass it. It is guaranteed that the roads do not form cyclic routes.

    It is guaranteed, that there is at most one road between each pair of showplaces.

    Output

    Print the single integer k (2 ≤ k ≤ n) — the maximum number of showplaces that Irina can visit during her journey from showplace 1 to showplace n within time not exceeding T, in the first line.

    Print k distinct integers in the second line — indices of showplaces that Irina will visit on her route, in the order of encountering them.

    If there are multiple answers, print any of them.

    Examples
    input
    4 3 13
    1 2 5
    2 3 7
    2 4 8
    output
    3
    1 2 4
    input
    6 6 7
    1 2 2
    1 3 3
    3 6 3
    2 4 2
    4 6 2
    6 5 1
    output
    4
    1 2 4 6
    input
    5 5 6
    1 3 3
    3 5 3
    1 2 2
    2 4 3
    4 5 2
    output
    3
    1 3 5

     题意:有向无环图,从1出发,到达节点n,在时间不超过T的情况下,最多经过多少个点。

    分析:

    咋一样,好像最短路分析不出来,有向无环图,说明从结点1出发,必定不能往回走了,这个时候应该考虑DP的,到达 i 节点不超过时间T(某一个时间)最多走多远,一个记忆化应该没有问题。

    关于递推的写法,就很神奇了,d[ i ] [ t ] ,但是这两种方法,都需要反着建边。

    有一种方式: d[ i ] [ j ] 走 i 个节点,到达 j 的最少时间。但是你会怎么到达 j 呢? 枚举边。很神奇~~~

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    const int maxn = 5005;
    const int maxm = 5005;
    const int inf = 0x3f3f3f3f;
    
    int n,m,T;
    struct Edge {
        int u,v,w;
    };
    
    int d[maxn][maxn];
    int pre[maxn][maxn];
    
    vector<Edge> edges;
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        cin>>n>>m>>T;
    
        for(int i = 0; i < m; ++i) {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            edges.push_back((Edge){u,v,w});
        }
        memset(d,inf,sizeof(d));
    
        d[1][1] = 0;
        int cnt = 0;
        for(int i = 2; i <= n; i++) {
            for(int j = 0; j < m; j++) {
                int u = edges[j].u;
                int v = edges[j].v;
                int w = edges[j].w;
    
                if(d[i-1][u]+w < d[i][v]) {
                    d[i][v] = d[i-1][u] + w;
                    pre[i][v] = u;
                }
    
    
            }
            if(d[i][n]<=T) {
                cnt = i;
            }
        }
    
        cout<<cnt<<endl;
        vector<int> ans;
        ans.push_back(n);
        while(true) {
            ans.push_back(pre[cnt][n]);
            n = pre[cnt][n];
            cnt--;
            if(n==1) break;
        }
    
        for(int i = ans.size()-1;i >=0; i--)
            printf("%d ",ans[i]);
        puts("");
    
    
        return 0;
    }

     

     

     

  • 相关阅读:
    2019/9/8
    实现简单的网页登录注册功能 (使用html和css以及javascript技术) 没有美化的日后补全
    测试一些以前的代码
    使用三层开发遵循的原则
    超市管理
    热身训练
    考试第三题
    考试第七题
    考试第10题
    考试第8题
  • 原文地址:https://www.cnblogs.com/TreeDream/p/7701820.html
Copyright © 2020-2023  润新知