• <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 - 20,  comments - 13,  trackbacks - 0

            解決問題:
            N個男的和M個女的,已知道每個男的只能接受哪些女的,求最多能夠匹配多少對情侶?

            思路:
            1.只要求出有多少個男的找到對象即可。
            2.遍歷所有男的,對于每個男的做以下處理(3~5),最后進(jìn)入6
            3.隨便找一個他能夠接受的女的,判斷這個女的是否被“挑選”過了,沒挑選過的則設(shè)置為挑選并進(jìn)入4,否則繼續(xù)找下一個女的,找遍所有都是挑選過的則進(jìn)入5
            4.判斷這個女的是否有男朋友了,沒有就直接和上述的男的進(jìn)行匹配,如果有的話(假設(shè)她的男朋友是A),則對A進(jìn)行3的操作,如果該操作返回的是真,則說明這個女的可以和男的匹配,而A和另外的人匹配。返回真。
            5.返回假
            6.如果該男的找到女的,則最大匹配數(shù)+1.

            沒說清楚,配合代碼吧,很簡單的一個模板。

            #include <stdio.h>
            #include 
            <string.h>

            int n,m;
            int sum;
            int p[201];
            int b[201];
            int map[201][201];

            bool path(int cow)
            {
                
            int i;
                
            for(i=1;i<=m;i++)
                
            {
                    
            if(b[i]==0 && map[cow][i] == 1)
                    
            {
                        b[i] 
            = 1;
                        
            if(p[i]==0  || path(p[i]))
                        
            {
                            p[i]
            =cow;
                            
            return true;
                        }

                    }

                }

                
            return false;
            }


            int main()
            {
                
            int i,j;
                
            while(scanf("%d%d",&n,&m)!=EOF)
                
            {
                    sum
            =0;
                    memset(map,
            0,sizeof(map));
                    memset(p,
            0,sizeof(p));
                    
            for(i=1;i<=n;i++)
                    
            {
                        
            int a,b;
                        scanf(
            "%d",&a);
                        
            for(j=1;j<=a;j++)
                        
            {
                            scanf(
            "%d",&b);
                            map[i][b] 
            = 1;
                        }

                    }

                    
            for(i=1;i<=n;i++)
                    
            {
                        memset(b,
            0,sizeof(b));
                        
            if(path(i))
                            sum
            ++;
                    }

                    printf(
            "%d\n",sum);
                }

                
            return 0;
            }


            下面嘗試用鄰接表來解決類似的題目,但是如果不釋放內(nèi)存的話,會MLE,而通過free釋放內(nèi)存又會出現(xiàn)TLE錯誤,太囧了。。。良智說用STL的vector應(yīng)該可以處理這個問題,回頭再用vector,今天先發(fā)free的做法,雖然過不了~~

             

            #include <stdio.h>
            #include 
            <string.h>
            #include 
            <stdlib.h>

            struct edge{
                
            int to;
                edge
            * next;
            };

            edge list[
            101];

            int p,n;
            int par[301];
            int b[301];
            struct edge* temp;
            struct edge* e;

            bool path(int person)
            {
                
            struct edge* e = list[person].next;
                
            while(e)
                {
                    
            if(b[e->to]==0)
                    {
                        b[e
            ->to] = 1;
                        
            if(par[e->to]==0 || path(par[e->to]))
                        {
                            par[e
            ->to]=person;
                        
            //    printf("%d__%d\n",e->to,par[e->to]);
                            return true;
                        }
                    }
                    e 
            = e->next;
                }
                
            return false;
            }

            int main()
            {
                
            int i,j;
                
            int a,t2;
                
            int t;
                
            while(scanf("%d",&t)!=EOF)
                {
                    
            while(t--)
                    {
                        scanf(
            "%d%d",&p,&n);
                        {
                            
            int ans = 0;
                            
            //memset(map,0,sizeof(map));
                            memset(par,0,sizeof(par));
                            
            for(i=1;i<=p;i++)
                            {
                                scanf(
            "%d",&a);
                                
            //list[i] = (struct edge*)malloc(sizeof(edge));
                                struct edge* head = (&list[i]);
                                e 
            = head;
                                
            while(a--)
                                {
                                    scanf(
            "%d",&t2);
                                    temp 
            = (struct edge*)malloc(sizeof(edge));
                                    temp
            ->to = t2;
                                    e
            ->next = temp;
                                    e 
            = temp;
                                }
                                e
            ->next = NULL;
                                e 
            = head;
                                
            /*
                                while(e)
                                {
                                    printf("%d__%d\n",e->from,e->to);
                                    e=e->next;
                                }
            */
                            }

                            
            for(i=1;i<=p;i++)
                            {
                                memset(b,
            0,sizeof(b));
                                
            if(path(i))
                                {
                                    ans
            ++;
                                }
                                
            else
                                {
                                    printf(
            "NO\n");
                                    
            break;
                                }
                            }
                            
            if(ans==p)
                                printf(
            "YES\n");
                            
            for(i=1;i<=p;i++)
                            {
                                e 
            = list[i].next;
                                
            while(e)
                                {
                                    temp 
            = e;
                                    e
            =e->next;
                                    free(temp);
                                }
                            }
                        }
                    }
                }
                
            return 0;
            }

            posted on 2010-05-16 00:56 ACong 閱讀(194) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿

            隨筆檔案

            文章檔案

            廣商豪杰

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            青青青青久久精品国产h| 精品久久亚洲中文无码| 久久精品www| 亚洲精品无码久久久| 奇米影视7777久久精品| 国产精品一久久香蕉产线看| 久久精品一区二区| 亚洲婷婷国产精品电影人久久| 久久亚洲sm情趣捆绑调教| AAA级久久久精品无码片| 亚洲国产天堂久久综合| 99久久99久久| 久久久亚洲欧洲日产国码是AV| 久久国产精品久久| 亚洲中文精品久久久久久不卡| 国内精品久久久久久久影视麻豆| 久久精品免费一区二区| 久久久久久国产精品免费免费| 色婷婷综合久久久中文字幕| 久久性生大片免费观看性| 国产成人精品久久二区二区| 少妇无套内谢久久久久| 久久久艹| 久久精品国产一区二区电影| AV狠狠色丁香婷婷综合久久| 思思久久99热只有频精品66| 国产午夜精品久久久久九九电影| 久久99精品国产自在现线小黄鸭| 中文成人无码精品久久久不卡| 国内精品久久久久久久影视麻豆| 久久精品天天中文字幕人妻| 伊人久久大香线蕉av一区| 日韩AV毛片精品久久久| 久久国产高清一区二区三区| 青青青青久久精品国产h| 人人狠狠综合久久亚洲88| 久久精品国产99国产精品澳门 | 伊人久久综合热线大杳蕉下载| 久久久国产99久久国产一| 人妻精品久久久久中文字幕| 亚洲精品乱码久久久久久蜜桃|