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

            pku 2908

            2009年8月3日

            題目鏈接:PKU 2908 Quantum
              
            分類:bfs+堆優(yōu)化

            題目分析與算法原型
                     這道題總的來說是一個廣度優(yōu)先搜索,但是需要用最小堆進(jìn)行優(yōu)化(如果不用堆,呵呵,我沒試過,不過8成會TLE),每次從隊列中取隊頭元素進(jìn)行擴展(由于是最小堆,保證了每次取出的元素是當(dāng)前中花費最小的),需要注意的是,一個已經(jīng)入過隊列的元素,還可以再入隊列,只要此時他的花費比上次入隊列時小就行,還要注意的一點是結(jié)束條件應(yīng)該是當(dāng)且隊列彈出的隊頭元素的關(guān)鍵值等于目標(biāo)關(guān)鍵值,此時可以結(jié)束搜索,因為即使以后再次遇到該關(guān)鍵值的元素其花費肯定比現(xiàn)在的大,因為每次從隊頭開始擴展的元素都會比擴展他的父親元素的花費大,我就是這個退出條件沒搞好結(jié)果貢獻(xiàn)了n次的WA.............

            Code:

              1
            #include<stdio.h>
              2#include<string.h>
              3char beg[25],end[25];
              4int n,l,p,w,count,mincost[1200000];
              5bool flag[1200000],finish;
              6struct node
              7{
              8    int cost,num;
              9    char s[25];
             10}
            queue[1200000];
             11struct caozuo
             12{
             13    char s[25];
             14    int cost;
             15}
            op[35];
             16int cal(char ss[])
             17{
             18    int i,res=0;
             19    for(i=0;i<l;i++)res+=(ss[i]-'0')<<(l-1-i);
             20    return res;
             21}

             22void down_min_heap(int n,int h)//n表示堆元素的個數(shù),從0開始編號,從h開始往下調(diào)整
             23{
             24    int i=h,j=2*i+1;
             25    node temp=queue[i];
             26    while(j<n)
             27    {
             28        if(j<n-1&&queue[j].cost>queue[j+1].cost)j++;//若右孩子存在,且右孩子比較小,取右
             29        if(temp.cost<queue[j].cost)break;
             30        else
             31        {
             32            queue[i]=queue[j];
             33            i=j;
             34            j=2*i+1;
             35        }

             36    }

             37    queue[i]=temp;
             38}

             39void up_min_heap(int s)    //s表示最后一個的編號
             40{
             41    while (s>0&&queue[s].cost<queue[(s-1)/2].cost)     //從s開始往上調(diào)整
             42    
             43        node tt=queue[s];
             44        queue[s]=queue[(s-1)/2];
             45        queue[(s-1)/2]=tt;
             46        s=(s-1)/2
             47    }

             48}

             49void push(int x,int cost,char s[])
             50{
             51    queue[count].num=x;
             52    queue[count].cost=cost;
             53    strcpy(queue[count].s,s);
             54    count++;
             55    up_min_heap(count-1);
             56}

             57node pop()
             58{
             59    node res=queue[0];
             60    queue[0]=queue[count-1];
             61    count--;
             62    down_min_heap(count,0);
             63    return res;
             64}

             65void handle(int num,node x,int goal,int *ans)
             66{
             67    int i,k;
             68    node y=x;
             69    if(y.num==goal)
             70    {
             71        finish=true;
             72        *ans=y.cost;
             73        return ;
             74    }

             75    for(i=0;i<l;i++)
             76    {
             77        if(op[num].s[i]=='F')
             78        {
             79            if(y.s[i]=='0')y.s[i]='1';
             80            else y.s[i]='0';
             81        }

             82        else if(op[num].s[i]=='S')y.s[i]='1';
             83        else if(op[num].s[i]=='C')y.s[i]='0';
             84    }

             85    k=cal(y.s);
             86    if(!flag[k]||(flag[k]&&op[num].cost+y.cost<mincost[k]))
             87    {
             88        flag[k]=true;
             89        mincost[k]=op[num].cost+y.cost;
             90        push(k,op[num].cost+y.cost,y.s);
             91    }

             92}

             93int bfs(char a[],char b[])
             94{
             95    int r1=cal(a),r2=cal(b),i,ans;
             96    node tt;
             97    queue[0].num=r1;
             98    queue[0].cost=0;
             99    strcpy(queue[0].s,a);
            100    count=1;
            101    flag[r1]=true;
            102    mincost[r1]=0;
            103    while(count>0)
            104    {
            105        tt=pop();
            106        for(i=0;i<p&&!finish;i++)handle(i,tt,r2,&ans);
            107        if(finish)return ans;
            108    }

            109    return -1;
            110}

            111int main()
            112{
            113    int i;
            114    scanf("%d",&n);
            115    while(n--)
            116    {
            117        scanf("%d%d%d",&l,&p,&w);
            118        for(i=0;i<p;i++)scanf("%s %d",op[i].s,&op[i].cost);
            119        for(i=0;i<w;i++)
            120        {
            121            scanf("%s %s",beg,end);
            122            memset(flag,false,sizeof(flag));
            123            finish=false;
            124            int res=bfs(beg,end);
            125            if(res==-1)printf("NP");
            126            else printf("%d",res);
            127            if(i<w-1)printf(" ");
            128        }

            129        printf("\n");
            130    }

            131    return 1;
            132}

            133
            134
            135
            136

            posted on 2009-08-03 10:32 蝸牛也Coding 閱讀(179) 評論(0)  編輯 收藏 引用


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


            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久夜色撩人精品国产| 久久久久久人妻无码| 久久e热在这里只有国产中文精品99| 久久精品国产精品亚洲下载| 亚洲精品tv久久久久| 精品久久久久香蕉网| 久久99国产精品久久99小说| 久久久av波多野一区二区| 久久亚洲国产成人影院网站| 久久天堂电影网| 久久久久久曰本AV免费免费| 亚洲国产精品久久久久久| 国产精品岛国久久久久| 久久无码人妻一区二区三区午夜| 久久综合久久性久99毛片| 91精品国产高清久久久久久io| 中文字幕日本人妻久久久免费| 亚洲国产高清精品线久久 | 中文国产成人精品久久不卡 | 亚洲欧美成人综合久久久| 久久这里有精品视频| 久久这里只有精品久久| 性色欲网站人妻丰满中文久久不卡 | 久久综合亚洲色HEZYO社区| 久久久久国产精品| 久久66热人妻偷产精品9| 人妻精品久久无码专区精东影业| 亚洲精品乱码久久久久久蜜桃图片 | 久久久这里只有精品加勒比| 国产精品va久久久久久久| 99久久精品毛片免费播放| 看久久久久久a级毛片| 久久久久免费精品国产| 99久久久国产精品免费无卡顿| 久久er热视频在这里精品| 久久精品国产99久久久| 久久久久99精品成人片欧美| 久久综合久久综合久久| 99久久99久久| 亚洲一区精品伊人久久伊人| 亚洲&#228;v永久无码精品天堂久久 |