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