http://acm.sgu.ru/problem.php?contest=0&problem=103
简单的最短路 不过在处理等待时间上有点繁琐
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=305;
int dist[N],pre[N];
int d[N][N];
bool had[N];
struct node
{
char c;
int r,tb,tp;
}mem[N];
void M(int t,char &c,int &r,int tb,int tp)
{
if(t<=r) {r=r-t+1;return ;}
t=(t-r)%(tb+tp);
if(t==0)
{
if(c=='B') {c='B';r=1;}
else {c='P';r=1;}
return ;
}
if(c=='P')
{
if(t<=tb) {r=tb-t+1;c='B';}
else {r=(tp-(t-tb))+1;c='P';}
}else
{
if(t<=tp) {r=tp-t+1;c='P';}
else {r=(tb-(t-tp))+1;c='B';}
}
}
int F(int t,int l,int r)
{
char lc=mem[l].c,rc=mem[r].c;
int lr=mem[l].r,ltb=mem[l].tb,ltp=mem[l].tp;
int rr=mem[r].r,rtb=mem[r].tb,rtp=mem[r].tp;
M(t,lc,lr,ltb,ltp);
M(t,rc,rr,rtb,rtp);
if(lc==rc)
return 0;
if(lr==rr&<b==rtp&<p==rtb)
return INF;
if(lr!=rr)
return min(lr,rr);
int tmp=lr;
if(lc=='B') {lc='P';lr=ltp;}
else {lc='B';lr=ltb;}
if(rc=='B') {rc='P';rr=ltp;}
else {rc='B';rr=rtb;}
if(lr!=rr)
return tmp+min(lr,rr);
tmp+=lr;
if(lc=='B') {lc='P';lr=ltp;}
else {lc='B';lr=ltb;}
if(rc=='B') {rc='P';rr=ltp;}
else {rc='B';rr=rtb;}
if(lr!=rr)
return tmp+min(lr,rr);
return INF;
}
int dijkstra(int x1,int x2,int n)
{
memset(had,false,sizeof(had));
for(int i=1;i<=n;++i)
dist[i]=INF;
dist[x1]=0;
pre[x1]=x1;
for(int w=1;w<=n;++w)
{
int k=-1;
for(int i=1;i<=n;++i)
if(!had[i]&&(k==-1||dist[i]<dist[k]))
k=i;
if(k==-1||dist[k]==INF||k==x2)
break;
had[k]=true;
for(int i=1;i<=n;++i)
{
int tmp=F(dist[k]+1,k,i);
if(!had[i]&&dist[i]>dist[k]+d[k][i]+tmp)
{
dist[i]=dist[k]+d[k][i]+tmp;
pre[i]=k;
}
}
}
return dist[x2];
}
int main()
{
//freopen("data.in","r",stdin);
int x1,x2;
while(cin>>x1>>x2)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>mem[i].c>>mem[i].r>>mem[i].tb>>mem[i].tp;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i==j) d[i][j]=0;
else d[i][j]=INF;
while(m--)
{
int l,r,len;
cin>>l>>r>>len;
d[l][r]=len;
d[r][l]=len;
}
int T=dijkstra(x1,x2,n);
if(T==INF)
cout<<"0"<<endl;
else
{
cout<<T<<endl;
//for(int i=1;i<=n;++i)
//cout<<pre[i]<<" ";cout<<endl;
stack<int>st;
int k=x2;
//cout<<x1<<" "<<x2<<endl;
while(k!=x1)
{
st.push(k);
k=pre[k];
}
//cout<<st.size()<<endl;
st.push(k);
while(!st.empty())
{
cout<<(st.top())<<" ";
st.pop();
}
cout<<endl;
}
}
return 0;
}