| ||||||||||
| 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 | |||||||||
谁能帮我看看哪里有错?晚上要交了十分着急#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