• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 7,comments - 3,trackbacks - 0
            Slim Span
            Time Limit: 5000MSMemory Limit: 65536K
            Total Submissions: 4023Accepted: 2116

            Description

            Given an undirected weighted graph G, you should find one of spanning trees specified as follows.

            The graph G is an ordered pair (VE), where V is a set of vertices {v1v2, …, vn} and E is a set of undirected edges {e1e2, …, em}. Each edge e ∈ E has its weight w(e).

            A spanning tree T is a tree (a connected subgraph without cycles) which connects all the n vertices with n − 1 edges. The slimness of a spanning tree T is defined as the difference between the largest weight and the smallest weight among the n − 1 edges of T.


            Figure 5: A graph G and the weights of the edges

            For example, a graph G in Figure 5(a) has four vertices {v1v2v3v4} and five undirected edges {e1e2e3e4e5}. The weights of the edges are w(e1) = 3, w(e2) = 5, w(e3) = 6, w(e4) = 6, w(e5) = 7 as shown in Figure 5(b).


            Figure 6: Examples of the spanning trees of G

            There are several spanning trees for G. Four of them are depicted in Figure 6(a)~(d). The spanning tree Ta in Figure 6(a) has three edges whose weights are 3, 6 and 7. The largest weight is 7 and the smallest weight is 3 so that the slimness of the tree Ta is 4. The slimnesses of spanning trees TbTc and Td shown in Figure 6(b), (c) and (d) are 3, 2 and 1, respectively. You can easily see the slimness of any other spanning tree is greater than or equal to 1, thus the spanning tree Td in Figure 6(d) is one of the slimmest spanning trees whose slimness is 1.

            Your job is to write a program that computes the smallest slimness.

            Input

            The input consists of multiple datasets, followed by a line containing two zeros separated by a space. Each dataset has the following format.

            nm
            a1b1w1
            ambmwm

            Every input item in a dataset is a non-negative integer. Items in a line are separated by a space. n is the number of the vertices and m the number of the edges. You can assume 2 ≤ n ≤ 100 and 0 ≤ m ≤ n(n − 1)/2. ak and bk (k = 1, …, m) are positive integers less than or equal to n, which represent the two vertices vak and vbk connected by the kth edge ekwk is a positive integer less than or equal to 10000, which indicates the weight of ek. You can assume that the graph G = (VE) is simple, that is, there are no self-loops (that connect the same vertex) nor parallel edges (that are two or more edges whose both ends are the same two vertices).

            Output

            For each dataset, if the graph has spanning trees, the smallest slimness among them should be printed. Otherwise, −1 should be printed. An output should not contain extra characters.

            Sample Input

            4 5
            1 2 3
            1 3 5
            1 4 6
            2 4 6
            3 4 7
            4 6
            1 2 10
            1 3 100
            1 4 90
            2 3 20
            2 4 80
            3 4 40
            2 1
            1 2 1
            3 0
            3 1
            1 2 1
            3 3
            1 2 2
            2 3 5
            1 3 6
            5 10
            1 2 110
            1 3 120
            1 4 130
            1 5 120
            2 3 110
            2 4 120
            2 5 130
            3 4 120
            3 5 110
            4 5 120
            5 10
            1 2 9384
            1 3 887
            1 4 2778
            1 5 6916
            2 3 7794
            2 4 8336
            2 5 5387
            3 4 493
            3 5 6650
            4 5 1422
            5 8
            1 2 1
            2 3 100
            3 4 100
            4 5 100
            1 5 50
            2 5 50
            3 5 50
            4 1 150
            0 0

            Sample Output

            1
            20
            0
            -1
            -1
            1
            0
            1686
            50

            Source



            題目就是生成一棵樹,要求邊權最大減最小的差最小。
            根據Kruskal思想,把邊排序,之后枚舉一下就行了。

            代碼:

            #include <cmath>
            #include 
            <cstdio>
            #include 
            <cstdlib>
            #include 
            <cstring>
            #include 
            <iostream>
            #include 
            <algorithm>
            using namespace std;

            const int M = 5005;
            const int INF = 1 << 29;

            struct edge
            {
                
            int st, ed, w;
                
            bool operator < (edge a) const
                {
                    
            return w < a.w;
                }
            } e[M];

            int n, m, ans, num, temp;
            int f[105], rank[105];

            void makeset()
            {
                
            for (int i = 1; i <= n; ++i)
                    f[i] 
            = i;
                memset(rank, 
            0sizeof(rank));
            }

            int find(int x)
            {
                
            while (f[x] != x) x = f[x];
                
            return x;
            }

            void unionset(int a, int b)
            {
                
            int p = find(a);
                
            int q = find(b);
                
            if (rank[p] > rank[q])
                    f[q] 
            = p;
                
            else
                
            if (rank[p] < rank[q])
                    f[p] 
            = q;
                
            else
                {
                    f[p] 
            = q;
                    rank[q]
            ++;
                }
            }

            void kruskal()
            {
                ans 
            = INF;
                
            for (int i = 0; i < m - n + 2++i)
                {
                    makeset();
                    temp 
            = -1;
                    num 
            = 0;
                    
            for (int j = i; j < m; ++j)
                    {
                        
            if (find(e[j].st) != find(e[j].ed))
                        {
                            num
            ++;
                            unionset(e[j].st, e[j].ed);
                            
            if (num == n - 1)
                            {
                                temp 
            = e[j].w - e[i].w;
                                
            break;
                            }
                        }
                    }
                    
            if (temp == -1break;
                    
            if (temp != -1 && temp < ans) ans = temp;
                }
                
            if (ans >= INF) printf("-1\n");
                
            else printf("%d\n", ans);
            }

            int main()
            {
                
            while (scanf("%d%d"&n, &m), n || m)
                {
                    
            for (int i = 0; i < m; ++i)
                        scanf(
            "%d%d%d"&e[i].st, &e[i].ed, &e[i].w);
                    sort(e, e 
            + m);
                    kruskal();
                }
                
            return 0;
            }
            posted on 2011-10-17 15:54 LLawliet 閱讀(364) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            亚洲乱亚洲乱淫久久| 伊人久久大香线蕉综合5g| 精品久久久久久无码中文字幕一区 | 伊人 久久 精品| 亚洲AV无码久久精品蜜桃| 97久久天天综合色天天综合色hd | 久久无码人妻一区二区三区| 麻豆AV一区二区三区久久| 91久久精品国产91性色也| 久久91精品久久91综合| 久久香综合精品久久伊人| 蜜桃麻豆www久久| 久久久www免费人成精品| 久久久国产精品福利免费| 亚洲日韩欧美一区久久久久我| 久久久久AV综合网成人| 久久九九免费高清视频| 国内精品久久久久久99蜜桃| 免费无码国产欧美久久18| 国产精品免费久久| 国产精品美女久久久| 亚洲精品乱码久久久久久自慰| 亚洲国产精品狼友中文久久久 | 天天影视色香欲综合久久| 9999国产精品欧美久久久久久| 蜜臀久久99精品久久久久久小说| 精品99久久aaa一级毛片| 久久精品国内一区二区三区| 亚洲精品乱码久久久久66| 亚洲欧美成人久久综合中文网 | 一本久久精品一区二区| 香蕉久久AⅤ一区二区三区| 久久九九有精品国产23百花影院| 久久久久久亚洲精品成人| 亚洲AV无码久久精品成人| 久久无码AV一区二区三区| 国产免费久久精品99re丫y| 久久无码精品一区二区三区| 国产无套内射久久久国产| 久久精品成人免费网站| 久久国产免费直播|