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

            1099. Work Scheduling

            Time Limit: 0.5 second
            Memory Limit: 16 MB
            There is certain amount of night guards that are available to protect the local junkyard from possible junk robberies. These guards need to scheduled in pairs, so that each pair guards at different night. The junkyard CEO ordered you to write a program which given the guards characteristics determines the maximum amount of scheduled guards (the rest will be fired). Please note that each guard can be scheduled with only one of his colleagues and no guard can work alone.

            Input

            The first line of the input contains one number N ≤ 222 which is the amount of night guards. Unlimited number of lines consisting of unordered pairs (ij) follow, each such pair means that guard #i and guard #j can work together, because it is possible to find uniforms that suit both of them (The junkyard uses different parts of uniforms for different guards i.e. helmets, pants, jackets. It is impossible to put small helmet on a guard with a big head or big shoes on guard with small feet). The input ends with Eof.

            Output

            You should output one possible optimal assignment. On the first line of the output write the even number C, the amount of scheduled guards. Then output C/2 lines, each containing 2 integers (ij) that denote that i and j will work together.

            Sample

            inputoutput
            3
            1 2
            2 3
            1 3
            
            2
            1 2
            
            Problem Author: Jivko Ganev



            模板題.....一般圖匹配主要看模板,剩下的就是自己YY建圖了.....

            模板:
            #include <cstdio>
            #include 
            <cstring>
            #include 
            <algorithm>
            #include 
            <iostream>
            #define MAXN 256
            using namespace std;

            struct Graph
            {
                
            bool mat[MAXN + 1][MAXN + 1];
                
            int n;

                
            bool inque[MAXN + 1];
                
            int que[MAXN], head, tail;

                
            int match[MAXN + 1], father[MAXN + 1], base[MAXN + 1];

                
            void init(int _n)
                {
                    n 
            = _n;
                    
            for (int i = 1; i <= n; ++i)
                    {
                        match[i] 
            = 0;
                        
            for (int j = 1; j <= n; ++j)
                            mat[i][j] 
            = false;
                    }
                }

                
            int pop()
                {
                    
            return que[head++];
                }

                
            void push(int x)
                {
                    que[tail
            ++= x;
                    inque[x] 
            = true;
                }

                
            void add_edge(int a, int b)
                {
                    mat[a][b] 
            = mat[b][a] = true;
                }

                
            int inpath[MAXN + 1];
                
            static int pcnt;

                
            int find_ancestor(int u, int v)
                {
                    
            ++pcnt;
                    
            while (u)
                    {
                        u 
            = base[u];
                        inpath[u] 
            = pcnt;
                        u 
            = father[match[u]];
                    }

                    
            while (true)
                    {
                        v 
            = base[v];
                        
            if (inpath[v] == pcnt)
                            
            return v;
                        v 
            = father[match[v]];
                    }
                }

                
            int inblossom[MAXN + 1];
                
            static int bcnt;

                
            void reset(int u, int anc)
                {
                    
            while (u != anc)
                    {
                        
            int v = match[u];
                        inblossom[
            base[v]] = bcnt;
                        inblossom[
            base[u]] = bcnt;
                        v 
            = father[v];
                        
            if (base[v] != anc) father[v] = match[u];
                        u 
            = v;
                    }
                }

                
            void contract(int u, int v)
                {
                    
            int anc = find_ancestor(u, v);
                    
            ++bcnt;
                    reset(u, anc);
                    reset(v, anc);
                    
            if (base[u] != anc) father[u] = v;
                    
            if (base[v] != anc) father[v] = u;
                    
            for (int i = 1; i <= n; ++i)
                        
            if (inblossom[base[i]] == bcnt)
                        {
                            
            base[i] = anc;
                            
            if (!inque[i]) push(i);
                        }
                }

                
            int find_augment(int start)
                {
                    
            for (int i = 1; i <= n; ++i)
                    {
                        father[i] 
            = 0;
                        inque[i] 
            = false;
                        
            base[i] = i;
                    }
                    head 
            = 0, tail = 0, push(start);
                    
            while (head < tail)
                    {
                        
            int u = pop();
                        
            for (int v = 1; v <= n; ++v)
                            
            if (mat[u][v] && base[v] != base[u] && match[v] != u)
                            {
                                
            if (v == start || (match[v] && father[match[v]]))
                                    contract(u, v);
                                
            else
                                {
                                    
            if (father[v] == 0)
                                    {
                                        
            if (match[v])
                                        {
                                            push(match[v]);
                                            father[v] 
            = u;
                                        }
                                        
            else
                                        {
                                            father[v] 
            = u;
                                            
            return v;
                                        }
                                    }
                                }
                            }
                    }
                    
            return 0;
                }

                
            void augment(int finish)
                {
                    
            int u = finish, v, w;
                    
            while (u)
                    {
                        v 
            = father[u];
                        w 
            = match[v];
                        match[u] 
            = v;
                        match[v] 
            = u;
                        u 
            = w;
                    }
                }

                
            int graph_max_match()
                {
                    
            int ans = 0;
                    
            for (int i = 1; i <= n; ++i)
                        
            if (match[i] == 0)
                        {
                            
            int finish = find_augment(i);
                            
            if (finish)
                            {
                                augment(finish);
                                ans 
            += 2;
                            }
                        }
                    
            return ans;
                }
            } g;

            int Graph :: bcnt = 0, Graph :: pcnt = 0;

            int main()
            {
                
            int n;
                scanf(
            "%d"&n);
                g.init(n);
                
            int a, b;
                
            while (scanf("%d%d"&a, &b) != EOF)
                    g.add_edge(a, b);
                printf(
            "%d\n", g.graph_max_match());
                
            for (int i = 1; i <= n; ++i)
                    
            if (g.match[i])
                    {
                        printf(
            "%d %d\n", i, g.match[i]);
                        g.match[g.match[i]] 
            = 0;
                    }
                
            return 0;
            }

            posted on 2011-10-15 22:16 LLawliet 閱讀(294) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            中文字幕热久久久久久久| 精品亚洲综合久久中文字幕| 免费一级欧美大片久久网| 国产精品九九久久免费视频 | 久久亚洲精品国产精品| 99久久国产综合精品麻豆| 久久青草国产精品一区| 亚洲嫩草影院久久精品| 四虎影视久久久免费观看| 中文字幕久久精品无码| 一级做a爰片久久毛片人呢| 亚洲欧美国产日韩综合久久| 国产午夜免费高清久久影院| 久久人人爽人爽人人爽av| 人妻精品久久无码区| 欧美国产精品久久高清| 人妻无码αv中文字幕久久| 99久久国产综合精品成人影院| 精品久久久无码21p发布 | 亚洲伊人久久综合中文成人网| 国内精品伊人久久久久av一坑| 中文字幕久久亚洲一区| 国产精品成人久久久久久久| 久久久精品国产sm调教网站| 精品久久久久久久国产潘金莲| 久久久久国产一区二区| 久久精品国产亚洲av麻豆色欲| 久久亚洲熟女cc98cm| 久久亚洲电影| 久久影院久久香蕉国产线看观看| 66精品综合久久久久久久| 久久99精品久久久久久hb无码| 亚洲日韩中文无码久久| 亚洲精品tv久久久久| 伊人 久久 精品| 亚洲国产精品综合久久一线| 欧美与黑人午夜性猛交久久久| 久久久久国色AV免费看图片| 久久综合九色综合久99| 亚洲精品97久久中文字幕无码| 少妇无套内谢久久久久|