SPFA的构图加判定 SGU 103

来源:互联网 发布:我的少女时代 知乎 编辑:程序博客网 时间:2024/05/21 21:01

                                                      SPFA

//By Zhang Jia Wei#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>//attention: 蓝色为0 , 紫色为1 (by JiaWeiZhang) using namespace std;int s,t;int n,m;const int maxthing=28001;const int maxn=301;bool start[maxn];int startc[maxn],blue[maxn],purple[maxn];int time[maxthing];int fa[maxn];int q[maxthing]; int p[maxthing];int d[maxthing];int isans[maxthing];int f[maxn][maxn];void init(){  int from,to,len; char ch;  scanf("%d%d",&s,&t);  scanf("%d%d",&n,&m);  getchar();  for(int i=1;i<=n;i++)  {    scanf("%c%d%d%d",&ch,&startc[i],&blue[i],&purple[i]);    getchar();    start[i]=(ch=='B'?0:1);  }  for(int i=1;i<=m;i++)  {  scanf("%d",&from);  scanf("%d",&to);  scanf("%d",&len);  f[from][to]=len,f[to][from]=len;  }    //for(int i=1;i<=n;i++)printf("%d %d %d %d\n",start[i],startc[i],blue[i],purple[i]);}const int inf=2147483647;void find(int x,int &wait,int time,int &color){  //start:color  //startc:time   //By GuoJian Zhang    //printf("%d\n",time);  if(time<startc[x])  {  wait=startc[x]-time;    color=start[x]^1;    return;  }  int temp=(time-startc[x])%(blue[x]+purple[x]);  int st=start[x]^1;    if(st==0)  {  if(temp<blue[x])  {    wait=blue[x]-temp;  color=1;}else{  wait=blue[x]+purple[x]-temp;  color=0;}return;  }    if(st==1)  {  if(temp<purple[x])  {    wait=purple[x]-temp;  color=0;}else{  wait=blue[x]+purple[x]-temp;  color=1;}return;  }}int bring(int a,int b,int time,int step){  if(step>3)return -1;    int px,py;  int cx,cy;  find(a,px,time,cx);  find(b,py,time,cy);    if(cx==cy)return time;  if(px==py)  {    return bring(a,b,time+px,step+1);  }    time+=min(px,py);  return time;  }void spfa(){  int di;   for(int i=1;i<=n;i++)d[i]=inf;  d[s]=0;q[1]=s;p[s]=1;int head=0,tail=1;    while(head<tail)  {  head++,di=q[head];  for(int i=1;i<=n;i++)    {       if(!f[di][i])continue;int road=bring(di,i,d[di],1);//printf("%d %d %d\n",road,di,i);    if (road==-1)continue;            road+=f[di][i];    if(road<d[i])    {      d[i]=road;      fa[i]=di;  if(!p[i])  {    p[i]=1;    tail++;    q[tail]=i;   }}  }  p[di]=0;  }     if(d[t]==inf)printf("%d\n",0);  else   {  int tant=0,ans=d[t];    printf("%d\n",ans);    while(t)tant++,isans[tant]=t,t=fa[t];    for(int i=tant;i>=2;i--)printf("%d ",isans[i]);printf("%d\n",isans[1]);  }}void write(){}int main(){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout);  init();  spfa();  //write();}


0 0
原创粉丝点击