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 |
Re:谁能帮我看看哪里有错?晚上要交了十分着急In Reply To:谁能帮我看看哪里有错?晚上要交了十分着急 Posted by:ds00548090 at 2006-11-29 14:56:52 > #include<iostream.h> > > struct junc > { > char Ci;//初始灯的颜色 > int riC;//初始颜色的持续时间 > int tiB;//蓝灯的持续时间 > int tiP;//紫灯的持续时间 > int index; > int pre; > int time;//走到这个路口的最短时间 > }; > > struct edge > { > int from; > int to; > }; > > class Graph > { > public: > int**r; > int *Mark; > int numOfJuc,numOfRoad;//交通路口数目和路的数目 > Graph(int n,int m); > edge FirstEdge(int v); //以V为起点的第一条边 > edge NextEdge(edge e); //以e的起点为起点的下一条边 > bool IsEdge(edge e); //判断是否是边 > }; > > class minHeap > { > public: > int size; > int currentSize; > junc*heap; > minHeap(int n); > void SiftDown(int left); > void SiftUp(int p); > void BuildHeap(); //建最小值堆 > bool removeMin(junc&d); //删掉堆中最小值 > void Insert(junc &t); //插入值 > bool empty(); > }; > > Graph::Graph(int n,int m) > { > int i,j; > numOfRoad=m; > numOfJuc=n; > r=new int*[numOfJuc+1];//记录每条路的长度 > Mark=new int[numOfJuc+1]; > > for(i=0;i<=numOfJuc;i++) > r[i]=new int[numOfJuc+1]; > > for(i=0;i<=numOfJuc;i++) > for(j=0;j<=numOfJuc;j++) > r[i][j]=1000000; > } > > edge Graph::FirstEdge(int v) > { > edge e; > int i; > e.from=v; > e.to=-1; > for(i=1;i<=numOfJuc;i++){ > if(r[v][i]<=100){ > e.to=i; > break; > } > } > return e; > } > > bool Graph::IsEdge(edge e) > { > if(e.to!=-1) > return true; > else > return false; > } > > edge Graph::NextEdge(edge e) > { > edge nexte; > nexte.from=e.from; > nexte.to=-1; > int i; > for(i=e.to+1;i<=numOfJuc;i++){ > if(r[e.from][i]<=100) > { > nexte.to=i; > break; > } > } > return nexte; > } > > minHeap::minHeap(int n) > { > size=n; > currentSize=0; > heap=new junc[size]; > } > > void minHeap::BuildHeap() > { > int i; > for(i=currentSize/2-1;i>=0;i--) > SiftDown(i); > } > > void minHeap::SiftDown(int left) > { > int i=left; > int j=2*left+1; > junc tmp=heap[i]; > > while(j<currentSize){ > if(j<currentSize-1 && heap[j].time>heap[j+1].time) > j++; > if(tmp.time>heap[j].time){ > heap[i].time=heap[j].time; > i=j; > j=2*j+1; > } > else > break; > } > heap[j]=tmp; > } > > bool minHeap::removeMin(junc&d) > { > junc tmp; > if(currentSize==0) > return false; > > currentSize--; > > tmp=heap[0]; > heap[0]=heap[currentSize]; > heap[currentSize]=tmp; > > if(currentSize>1) > SiftDown(0); > d=heap[currentSize]; > return true; > } > > void minHeap::SiftUp(int p) > { > int tmppos=p; > junc tmp=heap[tmppos]; > while(tmppos>0 && heap[(tmppos-1)/2].time>tmp.time) > { > heap[(tmppos-1)/2]=heap[tmppos]; > tmppos=(tmppos-1)/2; > } > heap[tmppos]=tmp; > } > > void minHeap::Insert(junc& t) > { > heap[currentSize]=t; > SiftUp(currentSize); > currentSize++; > } > > bool minHeap::empty() > { > if(currentSize==0) > return true; > else > return false; > } > ///////////////////////////////////////////////////////////////////////////////////////// > > int Wait(int from,int to, junc*D) > { > int t1=0,t2=0; > char c1=D[from].Ci; > char c2=D[to].Ci; > > if(D[from].time<D[from].riC)//时间小于初始状态维持的时间 > t1=D[from].riC-D[from].time;//记录变颜色还需多长时间 > else > { > t1=(D[from].time-D[from].riC)%(D[from].tiB+D[from].tiP); > if(c1=='B')//初始为蓝色 > { > if(t1<D[from].tiP) > { > t1=D[from].tiP-t1; > c1='P'; > } > else > { > t1=D[from].tiB+D[from].tiP-t1; > c1='B'; > } > } > else > { > if(t1<D[from].tiB) > { > t1=D[from].tiB-t1; > c1='B'; > } > else > { > t1=D[from].tiP+D[from].tiB-t1; > c1='P'; > } > } > }//cout<<"t1="<<t1<<endl; > > if(D[from].time<D[to].riC) > t2=D[to].riC-D[from].time; > else > { > t2=(D[from].time-D[to].riC)%(D[to].tiB+D[to].tiP); > if(c2=='P') > { > if(t2<D[to].tiB) > { > t2=D[to].tiB-t2; > c2='B'; > } > else > { > t2=D[to].tiP+D[to].tiB-t2; > c2='P'; > } > } > else > { > if(t2<D[to].tiP) > { > t2=D[to].tiP-t2; > c2='P'; > } > else > { > t2=D[to].tiB+D[to].tiP-t2; > c2='B'; > } > } > } > if(c1==c2) > return 0; > if(t1>t2) > return t2; > if(t1<t2) > return t1; > > if(c1=='B') > { > if(D[from].tiP!=D[to].tiB) > D[from].tiP<D[to].tiB?t1+=D[from].tiP:t1+=D[to].tiB; > else > { > if(D[from].tiB!=D[to].tiP) > D[from].tiB<D[to].tiP?t1+=D[from].tiB:t1+=D[to].tiP; > else > return 1000000; > } > } > else > { > if(D[from].tiB!=D[to].tiP) > D[from].tiB<D[to].tiP?t1+=D[from].tiB:t1+=D[to].tiP; > else > { > if(D[from].tiP!=D[to].tiB) > D[from].tiP<D[to].tiB?t1+=D[from].tiP:t1+D[to].tiB; > else > return 1000000; > } > return t1; > } > } > > int Quickest(int s,int end,junc*D,Graph&G) > { > int i; > > for(i=1;i<=G.numOfJuc;i++) > { > G.Mark[i]=0; > D[i].index=i; > D[i].pre=s; > D[i].time=1000000; > } > D[s].time=0; > minHeap H(G.numOfRoad); > H.Insert(D[s]); > > for(i=1;i<=G.numOfJuc;i++) > { > junc d; > while(!H.empty()) > { > if(!H.removeMin(d)) > return 1000000; > else > { > if(G.Mark[d.index]==0) > break; > } > } > if(d.index==end) > return D[end].time; > > int v=d.index; > G.Mark[v]=1; > for(edge e=G.FirstEdge(v);G.IsEdge(e);e=G.NextEdge(e)) > { > if(G.Mark[e.to] == 1) > continue; > int waitingTime=Wait(e.from,e.to,D);//计算需要等待的时间 > if(D[e.to].time>D[v].time+G.r[e.from][e.to]+waitingTime) > { > D[e.to].time=D[v].time+G.r[e.from][e.to]+waitingTime; > D[e.to].pre=v; > H.Insert(D[e.to]); > } > } > } > > return D[end].time; > } > > > void main() > { > int s,d;//起点和终点 > int juc,road; > int i; > > cin>>s>>d; > cin>>juc>>road; > > Graph G(juc,road); > > // minHeap H(road); > > junc*D; > D=new junc[G.numOfJuc+1]; > > for(i=1;i<=G.numOfJuc;i++) > cin>>D[i].Ci>>D[i].riC>>D[i].tiB>>D[i].tiP; > > for(i=1;i<=G.numOfRoad;i++) > { > int tmps,tmpd,weight; > cin>>tmps>>tmpd>>weight; > G.r[tmps][tmpd]=G.r[tmpd][tmps]=weight; > } > > int t=Quickest(s,d,D,G); > > if(t<1000000) > cout<<t<<endl; > else > cout<<0<<endl; > } > > Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator