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

            Why so serious? --[NKU]schindlerlee

            2010-02-04.ural1063-pku1756 graph theory and IDFS 此題在pku上42人AC

            2010-02-04.ural1063-pku1756
            ALGO:graph theory and IDFS
            題目中給給出了m(1 ≤ m ≤ 100)條無向邊,點是1-6,意思就是在這6個點上添加一些邊組成歐拉回路,
            并且要求點的和最小

            歐拉路存在的條件:奇度數(shù)頂點的個數(shù)為0或2且圖是連通的。
            我一開始的想法是:
            最多只有6個點,完全圖的邊的數(shù)量不過5+4+3+2+1=15條,我就想枚舉這些邊的組合。
            一共 2^15 種可能才 32 × 1024種可能。看了樣例才發(fā)現(xiàn)可以添加重邊。。。

            然后就只能搜了,怎么搜呢,迭代加深搜最好,但是要注意,有可能多添一條邊,但是花費卻變少了。
            然后就是最壞的情況也只能添加5條邊
            6
            1 1
            2 2
            3 3
            4 4
            5 5
            6 6

            然后就是寫代碼了,題目還是比較不好寫正確的
                1756    Domino Puzzle    42
            pku只有42人過了。。

              1 
              2 const int N = 8;
              3 const int M = 512;
              4 int edge[M][2],m,top;
              5 int vis[N],g[N][N],deg[N];
              6 int st[N],n; //the node exists in graph
              7 int exist[N],res;
              8 int save[M][2],sp;
              9 //http://m.shnenglu.com/schindlerlee/
             10 void dfs2(int u)
             11 {
             12   vis[u] = 1;
             13   for (int i = 1;i <= 6;i++) {
             14       if (g[u][i] && !vis[i]) {
             15           dfs2(i);
             16       }
             17   }
             18 }
             19 
             20 bool connected()
             21 {
             22   memset(vis,0,sizeof(vis));
             23   dfs2(st[0]);
             24   for (int i = 0;i < n;i++) {
             25       if (!vis[st[i]]) {
             26           return false;
             27       }
             28   }
             29   return true;
             30 }
             31 
             32 int goaldepth;
             33 bool dfs(int depth,int curres,int begi,int begj)
             34      //加上begi和begj能從980ms -> 16ms
             35 {
             36   int i,j;
             37   if (depth == goaldepth) {
             38       int cnt = 0;
             39       for (i = 1;i <= 6;i++) {
             40           if (deg[i] & 1) {
             41               cnt++;
             42           }
             43       }
             44       if (curres < res && (cnt == 0 || cnt == 2&& connected()) {
             45           res = curres;
             46           sp = top - m;
             47           for (i = 0;i < sp;i++) {
             48               save[i][0= edge[i+m][0];
             49               save[i][1= edge[i+m][1];
             50           }
             51           return true;
             52       }
             53       return false;
             54   }
             55   for (i = begi;i < n;i++) {
             56       for (j = begj;j < n;j++) {
             57           if (i != j) {
             58               int a = st[i],b = st[j];
             59               if (curres + a + b >= res) { continue; }
             60               g[a][b]++;
             61               g[b][a]++;
             62               deg[a]++;
             63               deg[b]++;
             64               edge[top][0]=a, edge[top][1]=b,top++;
             65               dfs(depth+1,curres + a + b,i,j);
             66               top--;
             67               g[a][b]--;
             68               g[b][a]--;
             69               deg[a]--;
             70               deg[b]--;
             71           }
             72       }
             73   }
             74 }
             75 
             76 int main()
             77 {
             78   int i,j,k;
             79   scanf("%d",&m);
             80   for (i = 0;i < m;i++) {
             81       int a,b;
             82       scanf("%d%d",&a,&b);
             83       edge[i][0= a;
             84       edge[i][1= b;
             85       exist[a] = 1;
             86       exist[b] = 1;
             87       g[a][b] ++;
             88       g[b][a] ++;
             89       deg[a]++;
             90       deg[b]++;
             91   }
             92   for (i = 1;i <= 6;i++) {
             93       if (exist[i]) {
             94           st[n++= i;
             95       }
             96   }
             97 
             98   res = maxint;
             99   for (i = 0;i <= 5;i++) {
            100       top = m;
            101       goaldepth = i;
            102       dfs(0,0,0,0);
            103   }
            104 
            105   printf("%d\n",res);
            106   printf("%d\n",sp);
            107   for (i = 0;i < sp;i++) {
            108       printf("%d %d\n",save[i][0],save[i][1]);
            109   }
            110 
            111   return 0;
            112 }
            113 


            posted on 2010-02-04 14:42 schindlerlee 閱讀(1103) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告

            欧美亚洲另类久久综合婷婷| 国产成人精品久久一区二区三区av | 伊人久久大香线焦综合四虎| 99久久综合狠狠综合久久| 国产精品久久久久久久午夜片 | 精品久久久久久无码专区 | 国产成人久久精品区一区二区| 久久久中文字幕| 99久久做夜夜爱天天做精品| 丰满少妇人妻久久久久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久久久亚洲av综合波多野结衣| 久久天堂AV综合合色蜜桃网| 99精品伊人久久久大香线蕉| 亚洲中文字幕久久精品无码APP| 91久久精品电影| 久久精品麻豆日日躁夜夜躁| 久久精品国产WWW456C0M| 潮喷大喷水系列无码久久精品| 亚洲成av人片不卡无码久久| AV色综合久久天堂AV色综合在| 中文字幕精品无码久久久久久3D日动漫| 少妇久久久久久久久久| 久久无码专区国产精品发布| 亚洲综合精品香蕉久久网97 | 国产高潮国产高潮久久久91| 综合网日日天干夜夜久久| 国内精品久久久久影院网站| 久久99免费视频| 国产精品久久一区二区三区| 久久久久久综合网天天| 思思久久99热免费精品6| 久久精品亚洲精品国产欧美| 国产69精品久久久久99尤物| 久久99精品久久久久久hb无码| 色综合久久无码五十路人妻| 麻豆精品久久久久久久99蜜桃| 久久精品国产亚洲AV忘忧草18 | 少妇无套内谢久久久久| 青青热久久国产久精品 | 久久久久亚洲精品无码蜜桃|