• <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久久亚洲综合精品成人| 久久人人爽人人爽人人片av麻烦| 狠狠色丁香久久综合五月| 日韩一区二区久久久久久 | 久久毛片免费看一区二区三区| 久久97久久97精品免视看秋霞| 性做久久久久久久久| 久久丫精品国产亚洲av不卡 | 久久99热精品| 大香伊人久久精品一区二区| 久久香蕉国产线看观看精品yw| 久久WWW免费人成—看片| 日韩人妻无码精品久久免费一| 一级做a爰片久久毛片人呢| 精品国产乱码久久久久久呢| 久久久久99精品成人片三人毛片| 久久AV无码精品人妻糸列| 99热成人精品免费久久| 色综合久久综合中文综合网| 日本精品久久久久影院日本| 久久久久免费精品国产| 亚洲AV日韩精品久久久久久 | 国产精品久久久久蜜芽| 97超级碰碰碰碰久久久久| 久久精品国产清高在天天线| 精品综合久久久久久97| 伊人久久大香线蕉综合热线| 午夜精品久久久久久影视777| 久久精品国产久精国产| 99久久无码一区人妻a黑| 色欲久久久天天天综合网| 久久婷婷五月综合成人D啪 | 久久伊人五月天论坛| 国产精品熟女福利久久AV| 久久996热精品xxxx| 久久人人爽人人爽AV片| 日日狠狠久久偷偷色综合96蜜桃 | 久久国产高潮流白浆免费观看| 浪潮AV色综合久久天堂| 99久久99这里只有免费的精品| 国产精品久久久久AV福利动漫 |