• 贪心


    poj 2387 dijkstra

    #include <iostream>
    #include <vector>
    using namespace std;
    /**
     * poj 2387 link: http://poj.org/problem?id=2387
     */
    
    int main(){
        int T, N;
        /**
         * 赋值INF要注意一定要够大
         */
        const int INF = 10000000;
        cin >> T >> N;
        vector<vector<int> > m(N + 1, vector<int>(N + 1, INF));
        vector<int> dist(N + 1, INF);
        vector<bool> visit(N+1, false);
        int s, e, d;
        while(T > 0){
            cin >> s >> e >> d;
            m[s][e] = m[e][s] = min(d,  m[e][s]);
            T--;
        }
        int origin = 1;
        
        for(int i = 1; i <= N; i++){
            dist[i] = m[origin][i];
        }
    
        dist[origin] = 0;
        visit[origin] = true;
    
        for(int c = 0; c < N; c++){
            int mini = INF;
            int idx = 1;
            for(int i = 1; i <= N; i++){
                if(!visit[i] && dist[i] < mini){
                    mini = dist[i];
                    idx = i;
                }
            }
            visit[idx] = true;
            for(int i = 1; i <= N; i++){
                if(!visit[i] && dist[idx] + m[idx][i] < dist[i]){
                    dist[i] = dist[idx] + m[idx][i];
                }
            }
        }
    
        cout << dist[N] << endl;
    
        return 0;
    }
    
    #include <iostream>
    using namespace std;
    /**
     * http://poj.org/problem?id=1251
     */
    const int maxN = 30;
    const int INF = 0x3f3f3f3f;
    int m[maxN][maxN];
    int dist[maxN];
    bool visit[maxN];
    int n;
    int prim(){
        int start = 0;
        int idx;
        int ans = 0;
        for(int i =0; i < n; i++) dist[i] = m[0][i]; 
        visit[start] = true;
    
        for(int c = 1; c < n; c++){
            int mini = INF;
            for(int i = 0; i < n; i++){
                if(!visit[i] && dist[i] < mini){
                    mini = dist[i];
                    idx = i;
                }
            }
    
            visit[idx] = true;
            ans += mini;
            for(int i = 0; i < n; i++){
                if(!visit[i] && m[idx][i] < dist[i]){
                    dist[i] = m[idx][i];
                }
            }
        }
    
        return ans;
    }
    
    int main(){
    
        int  c, l;
        char s, e;
        while(cin >> n, n){
            
            
            for(int i = 0; i < n; i++){
                visit[i] = false;
                for(int j = 0; j < n; j++){
                    m[i][j] = INF;
                }
            }
            int t = n;
            n = n - 1;        
            while(n > 0){
                cin >> s;
                cin >> c;
                   
                while(c > 0){
                    cin >> e >> l;
                    
                    m[s - 'A'][e - 'A'] = m[e - 'A'][s - 'A'] = l;
                    c--;
                }
    
                n--;
                
            }
    
            n = t;
            for(int i = 0; i < n; i++) dist[i] = INF;
    
            cout << prim() << endl;
        }
        
        return 0;
    }
    
  • 相关阅读:
    BZOJ1691: [Usaco2007 Dec]挑剔的美食家
    BZOJ1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
    BZOJ3057: 圣主的考验
    BZOJ1770: [Usaco2009 Nov]lights 燈
    1710: [Usaco2007 Open]Cheappal 廉价回文
    「Poetize7」电话线路
    「Poetize6」Candle
    「Poetize5」水叮当的舞步
    解题:CF983A Finite or not
    解题:POI 2013 Triumphal arch
  • 原文地址:https://www.cnblogs.com/qbits/p/11435972.html
Copyright © 2020-2023  润新知