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 |
求指点,在vc6.0上可以,但是WA//Dijkstra算法 #include<iostream> #define N 301 using namespace std; int Road[N][N]; //路的信息,不用0下标,不可达用infinite; enum color{B,P}; //颜色 const int infinite=99999; struct junction { color State; //初始颜色 int InitT; //初始变化时间 int BT; //蓝色持续时间 int PT; //紫色持续时间 }junct[N]; //路口信息,不使用下标0 struct{ int p; //记录前一个点 int t; //到该点的最短距离 }path[N]; //点的路径 int lowT[N]; //各点到已加入点的最短时间 int FindMinRoad(int s,int e,int n) //寻找最短时间 ,s为起始点,e终点,n为实际路口点的个数 { void update(int current,int n); //根据当前加入的点更新lowT和path数组 int find_minT(int n); //从lowT中找到时间最小但不为0的点,返回点号 int waitT(int current,int next); //根据current点,下一个点的最小等待时间,并返回 for(int i=1;i<=n;i++) //将点s加入,初始化 { if(i==s){lowT[i]=0;continue;} path[i].p=s; path[i].t=lowT[i]=waitT(s,i)+Road[s][i]; } int current=find_minT(n); while(current!=e)//未到达终点 { update(current,n); //更新lowT和path数组 current=find_minT(n);//找到一个最小的时间号 if(current==0)return 0; //无法到达返回0; } return path[e].t; //返回到达点e的最短时间 } //在lowT中找不为0但最小的点号 int find_minT(int n) { int min=infinite; int t=0; //无最小的点 for(int i=1;i<=n;i++) if(lowT[i]!=0&&lowT[i]<min){min=lowT[i];t=i;} return t; } void update(int current,int n) { int waitT(int current,int next); //根据current点,下一个点的最小等待时间,并返回 for(int i=1;i<=n;i++) { if(lowT[i]==0)continue; if(i==current){lowT[i]=0;continue;} int t=waitT(current,i)+Road[current][i]; if(t+path[current].t<lowT[i]){path[i].p=current; path[i].t=t+path[current].t;lowT[i]=t;} } } int waitT(int current,int next) //求等待时间 { color get_color(int m,int T,int *t); //求点m的当前状态,t为时间余量,T为已经经历的时间 if(junct[current].State==junct[next].State&&junct[current].InitT==junct[next].InitT &&junct[current].BT==junct[next].PT&&junct[current].PT==junct[next].BT)return infinite; //不可通过 if(Road[current][next]==infinite)return infinite; int t=path[current].t; //已经经过的时间 color s1,s2; //两个点当前的状态 int t1,t2; s1=get_color(current,t,&t1); s2=get_color(next,t,&t2); //求点的当前状态 if(s1==s2)return 0; //颜色相同等待时间为0 if(t1<t2)return t1; if(t1>t2)return t2; if(s1==B) { if(junct[current].PT<junct[next].BT)return t1+junct[current].PT; if(junct[current].PT>junct[next].BT)return t1+junct[next].BT; if(junct[current].BT<junct[next].PT)return t1+junct[current].PT+junct[current].BT; else return t1+junct[current].PT+junct[next].PT; } if(junct[current].BT<junct[next].PT)return t1+junct[current].BT; if(junct[current].BT>junct[next].PT)return t1+junct[next].PT; if(junct[current].PT<junct[next].BT)return t1+junct[current].BT+junct[current].PT; else return t1+junct[current].BT+junct[next].BT; } color get_color(int m,int T,int *t) { if(T<junct[m].InitT){*t=junct[m].InitT-T;return junct[m].State;} int mt=junct[m].InitT; color s; if(junct[m].State==B)s=P; else s=B; while(1) { if(s==B) { mt+=junct[m].BT; if(mt>T){*t=mt-T;return B;} mt+=junct[m].PT; if(mt>T){*t=mt-T;return P;} } mt+=junct[m].PT; if(mt>T){*t=mt-T;return P;} if(mt>T){*t=mt-T;return B;} } } int main() { int s,e,n,m; char h; cin>>s>>e; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>h>>junct[i].InitT>>junct[i].BT>>junct[i].PT; if(h=='B')junct[i].State=B; else junct[i].State=P; } for(i=1;i<=n;i++) for(int j=1;j<=n;j++){if(i==j)Road[i][j]=0;else Road[i][j]=infinite;} int han,lie,t; for(int j=0;j<m;j++) { cin>>han>>lie>>t; Road[han][lie]=t; Road[lie][han]=t; } cout<<FindMinRoad(s,e,n)<<endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator