Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这个题用DFS确实是可以过的,但是用DFS过只不过是运气好罢了,最好的算法不是搜索,是图论最短路In Reply To:哪位大侠过了的帮忙看看 Posted by:arcane at 2005-08-03 11:28:50 > 我用深搜+剪枝怎么还limited time exceed?哪位大侠帮忙看看(随手写的,很乱,呵呵) > #include<iostream.h> > #include<math.h> > #include<stack> > using namespace std; > struct subnod{ > int nextnode; > int cheaperprice; > subnod *nextsub; > }; > struct node{ > int price; > int level; > int numofsub; > subnod *firstsub; > }; > node nodearray[101]; > inline bool test(stack<subnod*> &a,int m,int d) > {int maxlev=d; > int minlev=d; > subnod *b; > stack<subnod*> c; > while(a.empty()==false) > {b=a.top(); > a.pop(); > c.push(b); > if(nodearray[b->nextnode].level>maxlev) > maxlev=nodearray[b->nextnode].level; > if(nodearray[b->nextnode].level<minlev) > minlev=nodearray[b->nextnode].level; > } > while(!c.empty()) > {b=c.top(); > c.pop(); > a.push(b); > } > if((maxlev-minlev)>m) > return false; > return true; > } > > void main() > {int M; > int N; > cin>>M; > cin>>N; > if(N<0||N>100) > return; > int i=1; > int j=1; > subnod *temp; > subnod *tempnext; > for(;i<=N;i++) > {cin>>nodearray[i].price; > cin>>nodearray[i].level; > cin>>nodearray[i].numofsub; > if(nodearray[i].numofsub!=0) > nodearray[i].firstsub=new subnod; > else nodearray[i].firstsub=NULL; > temp=nodearray[i].firstsub; > for(j=1;j<=nodearray[i].numofsub;j++) > {cin>>temp->nextnode; > cin>>temp->cheaperprice; > if(j==nodearray[i].numofsub) > tempnext=NULL; > else > tempnext=new subnod; > temp->nextsub=tempnext; > temp=tempnext; > } > } > int tempprice=0; > int tempmin=nodearray[1].price; > int max=nodearray[1].level; > stack<subnod*> astack; > if((temp=nodearray[1].firstsub)!=NULL) > {astack.push(temp); > while(temp!=NULL) > {if(test(astack,M,max)) > {tempprice+=(temp->cheaperprice); > if(tempprice+nodearray[temp->nextnode].price<tempmin) > tempmin=tempprice+nodearray[temp->nextnode].price; > temp=nodearray[temp->nextnode].firstsub; > if(temp!=NULL&&tempprice<tempmin) > astack.push(temp); > else > while(temp==NULL) > { if(!astack.empty()) > { > temp=astack.top(); > astack.pop(); > tempprice-=temp->cheaperprice; > temp=temp->nextsub; > if(temp!=NULL) > astack.push(temp); > } > else > {cout<<tempmin; > return; > } > } > } > else > {astack.pop(); > temp=temp->nextsub; > if(temp!=NULL&&tempprice<tempmin) > astack.push(temp); > else > while(temp==NULL) > { if(!astack.empty()) > { > temp=astack.top(); > astack.pop(); > tempprice-=temp->cheaperprice; > temp=temp->nextsub; > if(temp!=NULL) > astack.push(temp); > } > else > {cout<<tempmin; > return; > } > } > } > } > } > cout<<tempmin; > } > Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator