sgu103 SPFA水题

来源:互联网 发布:sql server2008r2下载 编辑:程序博客网 时间:2024/05/22 17:20

sgu103本来是一个水题,但是因为小错误调试了两天。。。

#include<queue>#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>const int inf=1000000;using namespace std;int dis[310],start,end,last[310];int bgn[310],to[28010],nxt[28010],w[28010];struct cross{bool c;int rc,t[2];}a[310];struct situation{bool c;int et;}s,e,da;int n,m,cnt;void add_edge(int x,int y,int z){cnt++;nxt[cnt]=bgn[x];bgn[x]=cnt;to[cnt]=y;w[cnt]=z;}situation getans(int i,int time){if(time<a[i].rc){da.et=a[i].rc-1-time;da.c=a[i].c;}else{time-=a[i].rc;time-=(time/(a[i].t[0]+a[i].t[1]))*(a[i].t[0]+a[i].t[1]);if(time<a[i].t[!a[i].c]){da.et=a[i].t[!a[i].c]-1-time;da.c=!a[i].c;}else{da.et=a[i].t[a[i].c]+a[i].t[!a[i].c]-1-time;da.c=a[i].c;}}return da;}char s1[10];void putout(int x){if(last[x])putout(last[x]);printf("%d ",x);}void SPFA(){queue<int>q;for(int i=1;i<=n;i++)dis[i]=inf;dis[start]=0;q.push(start);while(!q.empty()){int x=q.front();q.pop();for(int i=bgn[x];i;i=nxt[i]){int now=0,p=to[i],sum=0;s=getans(x,dis[x]);e=getans(p,dis[x]);while(sum<=3&&dis[x]+now+w[i]<dis[p]){if(s.c==e.c)break;else {if(s.et!=e.et){now=min(s.et+1,e.et+1);break;}else{if(dis[x]==0&&now==0)now+=a[x].rc;else now+=a[x].t[s.c];s.et+=a[x].t[!s.c];e.et+=a[p].t[!e.c];s.c=!s.c;e.c=!e.c;}}sum++;}if(dis[x]+now+w[i]<dis[p]&&sum<=3){dis[p]=dis[x]+now+w[i];last[p]=x;q.push(p);}}}if(dis[end]==inf)printf("0\n");else {printf("%d\n",dis[end]);putout(end);}return;}int main(){int x,y,z;scanf("%d%d",&start,&end);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%s",s1);if(s1[0]=='B')a[i].c=1;scanf("%d%d%d",&a[i].rc,&a[i].t[1],&a[i].t[0]);}for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);add_edge(x,y,z);add_edge(y,x,z);}SPFA();return 0;}


0 0
原创粉丝点击