Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

....这题20%的MLE都是我贡献的

Posted by liu_cheng_ao at 2016-09-28 16:57:27 on Problem 1947
迷之广搜MLE
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<functional>

using namespace std;
int n,p;
int head[160],to[310],nxt[310],vc;
int fa[160],bfso[160],bfsn[160],dl[160],dr[160],dfc;
struct Q{
       char c,rt[51],sz[51];
       bool operator <(const Q &b)const
       {return this->c>b.c;}
       }qt,qtg;;
priority_queue<Q>q;
void dfs(int k)
{
     dl[k]=++dfc;
     for(int i=head[k];i;i=nxt[i])
     {
             if(to[i]!=fa[k])
             {
                  fa[to[i]]=k;
                  dfs(to[i]);
             }
     }
     dr[k]=dfc;
}
void bfs()
{
     int h=0,t=1,q[1000];q[1]=1;
     while(h<t)
     {
               h++;
               bfsn[q[h]]=h;bfso[h]=q[h];
               for(int i=head[q[h]];i;i=nxt[i])
               {
                         if(to[i]!=fa[q[h]])
                         {
                              t++;
                              q[t]=to[i];
                         }
               }
     }
}
void init()
{
    scanf("%d%d",&n,&p);
    int f,t;
    for(int i=1;i<=n-1;i++)
    {
            scanf("%d%d",&f,&t);
            to[++vc]=t;
            nxt[vc]=head[f];
            head[f]=vc;
            to[++vc]=f;
            nxt[vc]=head[t];
            head[t]=vc;
    }
    dfs(1);bfs();
}
int main()
{
    init();
    if(p==n){printf("0");return 0;}
    qt.c=1;qt.rt[1]=1;qt.sz[1]=dr[1]-dl[1]+1;
    q.push(qt);
    while(!q.empty())
    {
                   qtg=q.top();q.pop();
                   for(int i=bfsn[qtg.rt[qtg.c]]+1;i<=n;i++)
                   {
                           int no=bfso[i];
                           qt=qtg;
                           qt.c++;
                           qt.rt[qt.c]=no;
                           qt.sz[qt.c]=dr[no]-dl[no]+1;
                           int j;
                           for(j=qtg.c;j>=1;j--)
                                   if(dl[no]>=dl[qtg.rt[j]]&&dl[no]<=dr[qtg.rt[j]])break;
                           qt.sz[j]-=qt.sz[qt.c];
                           if(qt.sz[j]==p||qt.sz[qt.c]==p)
                           {
                                                          printf("%d",qt.c-1);
                                                          return 0;
                           }
                           q.push(qt);
                   }
    }
    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator