• <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)  編輯 收藏 引用 所屬分類: 圖論
            久久久av波多野一区二区| 久久九九有精品国产23百花影院| 91久久成人免费| 久久一区二区三区99| 久久综合九色综合欧美就去吻 | 九九久久精品无码专区| 91久久九九无码成人网站| 久久久久久久久久久| 久久91精品久久91综合| 亚洲国产天堂久久久久久| 久久夜色精品国产噜噜亚洲AV| 精品久久久久中文字幕一区| 久久精品国产亚洲av麻豆蜜芽| 成人亚洲欧美久久久久| 久久久www免费人成精品| 99久久国产综合精品网成人影院| 91麻豆国产精品91久久久| 日本精品久久久久中文字幕8| 亚洲国产精品无码久久一线| 久久人妻少妇嫩草AV蜜桃| 国产一区二区精品久久| 亚洲精品乱码久久久久久久久久久久 | 亚洲嫩草影院久久精品| 少妇熟女久久综合网色欲| 国内精品欧美久久精品| 国产三级久久久精品麻豆三级| 国产精品久久久久蜜芽| 久久精品国产欧美日韩| 久久精品视频网| 婷婷久久久亚洲欧洲日产国码AV| 日本久久久久久久久久| 91精品国产91久久久久久青草| 久久A级毛片免费观看| 精品多毛少妇人妻AV免费久久| 久久精品国产亚洲7777| 91精品国产综合久久四虎久久无码一级 | 国产午夜福利精品久久2021 | 国产精品成人99久久久久 | 久久久久亚洲精品无码蜜桃| 少妇高潮惨叫久久久久久 | 99久久超碰中文字幕伊人|