zoukankan      html  css  js  c++  java
  • XTU2016CCPC中南邀请赛C

    Hamiltonian Path

    Accepted : 74   Submit : 189
    Time Limit : 2000 MS   Memory Limit : 65536 KB 

    Hamiltonian Path

    In ICPCCamp, there are n cities and m directed roads between cities. The i-th road going from the ai-th city to the bi-th city is ci kilometers long. For each pair of cities (u,v), there can be more than one roads from u to v.

    Bobo wants to make big news by solving the famous Hamiltonian Path problem. That is, he would like to visit all the n cities one by one so that the total distance travelled is minimized.

    Formally, Bobo likes to find n distinct integers p1,p2,,pn to minimize w(p1,p2)+w(p2,p3)++w(pn1,pn) where w(x,y) is the length of road from the x-th city to the y-th city.

    Input

    The input contains at most 30 sets. For each set:

    The first line contains 2 integers n,m (2n105,0m105).

    The i-th of the following m lines contains 3 integers ai,bi,ci (1ai<bin,1ci104).

    Output

    For each set, an integer denotes the minimum total distance. If there exists no plan, output -1 instead.

    Sample Input

    3 3
    1 2 1
    1 3 1
    2 3 1
    3 2
    1 2 1
    1 3 2
    

    Sample Output

    2
    -1

    注意条件ai是小于bi!这意味着什么?意味着只能1到2,2到3的来走,任何一个跳着城市编号的道路都是无用条件,只需要把最小的相邻城市的路加起来就行了。。。mp[i]表示i到i+1的城市路径,只要条件中缺少一个mp[i]就不能满足,只能输出-1

    #include <bits/stdc++.h>
    
    typedef long long ll;
    using namespace std;
    const int maxn = 1e4;
    int mp[maxn+10];
    ll ans;
    
    int main() {
    //    freopen("in.txt","r",stdin);
        int n,m;
        int flag = 0;
        while(~scanf("%d%d",&n,&m)) {
            ans = 0LL;
            for(int i = 1; i <= maxn; i++) mp[i] = maxn;
    //        cout<<ans;
            while(m--) {
                int a,b,c;
                cin>>a>>b>>c;
                if(a==b-1) {
                    if(mp[a]>c) {
                        mp[a] = c;
                    }
                }
            }
            for(int i = 1; i < n; i++) {
                if(mp[i]!=maxn) {
                    ans += mp[i];
                }
                else {
                    puts("-1");
                    flag = 1;
                    break;
                }
            }
            if(!flag)
                cout<<ans<<endl;
        }
    }
    


  • 相关阅读:
    Go语言趣学指南lesson3
    简单的>this
    多媒体查询
    解析对象原型链
    笑对人生,坐看云起云落
    HTML5
    javascript函数及作用域的小结
    不得不知call()和apply()
    浅谈弹性盒子布局
    编译原理实验(算符优先文法)
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256619.html
Copyright © 2011-2022 走看看