• <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

            Ice_cream’s world II

            Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
            Total Submission(s): 938    Accepted Submission(s): 192


            Problem Description
            After awarded lands to ACMers, the queen want to choose a city be her capital. This is an important event in ice_cream world, and it also a very difficult problem, because the world have N cities and M roads, every road was directed. Wiskey is a chief engineer in ice_cream world. The queen asked Wiskey must find a suitable location to establish the capital, beautify the roads which let capital can visit each city and the project’s cost as less as better. If Wiskey can’t fulfill the queen’s require, he will be punishing.
             

            Input
            Every case have two integers N and M (N<=1000, M<=10000), the cities numbered 0…N-1, following M lines, each line contain three integers S, T and C, meaning from S to T have a road will cost C.
             

            Output
            If no location satisfy the queen’s require, you must be output “impossible”, otherwise, print the minimum cost in this project and suitable city’s number. May be exist many suitable cities, choose the minimum number city. After every case print one blank.
             

            Sample Input
            3 1 0 1 1 4 4 0 1 10 0 2 10 1 3 20 2 3 30
             

            Sample Output
            impossible 40 0
             

            Author
            Wiskey
             

            Source
             

            Recommend
            威士忌
             



            思路:不定根的最小樹形圖,做法就是虛擬一個根,讓所有點到這個根連線邊,并且邊權值很大,這樣就能保證最后只有一個點連向這個虛擬根,這樣最后結果減去這個很大值就行了。
            代碼:
            #include <cstdio>
            #include 
            <cstring>
            #include 
            <algorithm>
            #define MAXN 1010
            #define MAXE 10100
            using namespace std;

            typedef 
            long long typec;
            const typec INF = 0x7fffffffffffffffLL;

            struct Arcs
            {
                
            int _a, _b;
            } arcs[MAXE 
            + MAXN];

            struct AdjNode
            {
                
            int _v;
                Arcs 
            *_rf;
                typec _c;
                AdjNode 
            *_next;
            *adj[MAXN], adjmem[MAXE + MAXN];
             
            int adjcnt;
             
            inline 
            void init(int n)
            {
                memset(adj, 
            0, n * sizeof(AdjNode *));
                adjcnt 
            = 0;
            }
             
            inline 
            void add_edge(int a, int b, typec c)
            {
                arcs[adjcnt]._a 
            = a;
                arcs[adjcnt]._b 
            = b;
                AdjNode 
            *ptr = adjmem + adjcnt++;
                ptr 
            -> _c = c;
                ptr 
            -> _v = a;
                ptr 
            -> _rf = arcs + adjcnt - 1;
                ptr 
            -> _next = adj[b];
                adj[b] 
            = ptr;
            }
             
            int pre[MAXN], real_pre[MAXN];
            bool is_out[MAXN];
            int vis[MAXN], vcnt;
             
            typec solve(
            int n, int root)
            {
                
            static typec ch[MAXN];
                memset(is_out, 
            false, n);
                typec ans 
            = 0;
                
            while (1)
                {
                    
            int i, j, k;
                    
            for (i = 0; i < n; ++i)
                        
            if (i != root && !is_out[i])
                        {
                            pre[i] 
            = i;
                            ch[i] 
            = INF;
                            AdjNode 
            *chp;
                            
            for (AdjNode *ptr = adj[i]; ptr; ptr = ptr -> _next)
                            {
                                j 
            = ptr -> _v;
                                
            if (!is_out[j])
                                {
                                    
            if (ch[i] > ptr -> _c)
                                    {
                                        pre[i] 
            = j;
                                        ch[i] 
            = ptr -> _c;
                                        chp 
            = ptr;
                                    }
                                    
            else if (ch[i] == ptr -> _c && ptr -> _rf -> _a == root && ptr -> _rf -> _b < chp -> _rf -> _b)
                                    {
                                        pre[i] 
            = j;
                                        chp 
            = ptr;
                                    }
                                }
                            }
                            
            if (pre[i] == i) throw false;
                            real_pre[chp 
            -> _rf -> _b] = chp -> _rf -> _a;
                        }
                    memset(vis, 
            0, n * sizeof(int));
                    vcnt 
            = 0;
                    
            for (i = 0; i < n; ++i)
                        
            if (i != root && !is_out[i])
                        {
                            j 
            = i;
                            vis[i] 
            = ++ vcnt;
                            
            while (vis[pre[j]] == 0 && pre[j] != root)
                            {
                                j 
            = pre[j];
                                vis[j] 
            = vcnt;
                            }
                            
            if (vis[pre[j]] == vcnt)
                            {
                                i 
            = pre[j];
                                
            break;
                            }
                        }
                    
            if (i == n)
                    {
                        
            for (j = 0; j < n; ++j)
                            
            if (j != root && !is_out[j])
                                ans 
            += ch[j];
                        
            break;
                    }
                    j 
            = i;
                    
            ++vcnt;
                    
            int ti = i;
                    
            do
                    {
                        ti 
            = min(ti, j);
                        vis[j] 
            = vcnt;
                        is_out[j] 
            = true;
                        ans 
            += ch[j];
                        j 
            = pre[j];
                    }
                    
            while (j != i);
                    i 
            = ti;
                    
            for (j = 0; j < n; ++j)
                        
            if (vis[j] == vcnt)
                            
            for (AdjNode **ptr = adj + j; *ptr;)
                            {
                                k 
            = (*ptr) -> _v;
                                
            if (!is_out[k])
                                {
                                    AdjNode 
            *p2 = *ptr;
                                    p2 
            -> _c -= ch[j];
                                    
            if (i != j)
                                    {
                                        
            *ptr = p2 -> _next;
                                        p2 
            -> _next = adj[i];
                                        adj[i] 
            = p2;
                                    }
                                    
            else
                                        ptr 
            = &((*ptr) -> _next);
                                }
                                
            else
                                    ptr 
            = &((*ptr) -> _next);
                            }
                    
            for (k = 0; k < n; ++k)
                        
            if (!is_out[k])
                            
            for (AdjNode *ptr = adj[k]; ptr; ptr = ptr -> _next)
                            {
                                j 
            = ptr -> _v;
                                
            if (vis[j] == vcnt)
                                    ptr 
            -> _v = i;
                            }
                    is_out[i] 
            = false;
                }
                
            return ans;
            }
             
            int main()
            {
                
            int n, m;
                
            while (scanf("%d%d"&n, &m) != EOF)
                {
                    init(n 
            + 1);
                    
            long long s = 1;
                    
            for (int i = 0; i < m; ++i)
                    {
                        
            int a, b, c;
                        scanf(
            "%d%d%d"&a, &b, &c);
                        
            if (a != b)
                        {
                            add_edge(a, b, c);
                            s 
            += c;
                        }
                    }
                    
            for (int i = 0; i < n; ++i)
                        add_edge(n, i, s);
                    
            long long ans = solve(n + 1, n);
                    
            int r, p;
                    
            for (r = 0; real_pre[r] != n; ++r);
                    
            for (p = r + 1; p < n; ++p)
                        
            if (real_pre[p] == n)
                            
            break;
                    
            if (p == n)
                        printf(
            "%I64d %d\n\n", ans - s, r);
                    
            else
                        printf(
            "impossible\n\n");
                }
                
            return 0;
            }
             
            posted on 2011-10-15 22:18 LLawliet 閱讀(256) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            久久99久久99精品免视看动漫| avtt天堂网久久精品| 久久免费大片| 亚洲香蕉网久久综合影视| 久久超乳爆乳中文字幕| 久久精品成人欧美大片| 99精品国产99久久久久久97 | 国产ww久久久久久久久久| 99热精品久久只有精品| 久久人人爽人人爽人人AV东京热| 精品午夜久久福利大片| 久久久久av无码免费网| 94久久国产乱子伦精品免费| 久久无码人妻一区二区三区午夜 | 久久亚洲私人国产精品vA| 欧美国产精品久久高清| 伊人丁香狠狠色综合久久| 亚洲AV无码久久精品蜜桃| 欧美亚洲国产精品久久久久| 国产高清国内精品福利99久久| 亚洲狠狠婷婷综合久久蜜芽 | 青青热久久综合网伊人| 伊人久久大香线蕉综合Av| 久久婷婷五月综合97色直播| 精品久久久久久无码免费| 久久综合久久综合久久| 久久久亚洲欧洲日产国码aⅴ| 久久久久久久波多野结衣高潮 | 伊人久久成人成综合网222| 91精品国产色综久久| 久久精品国产久精国产| 精品国产乱码久久久久久1区2区 | 久久亚洲高清观看| 九九99精品久久久久久| 久久国产精品99精品国产987| 99久久精品费精品国产一区二区| 久久Av无码精品人妻系列| 久久精品天天中文字幕人妻| 7777久久亚洲中文字幕| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产精品久久国产精麻豆99网站|