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
- SPFA的构图加判定 SGU 103
- sgu 326 最大流 不错的构图。。哦哦类。。。
- SGU 103 Traffic Lights(Spfa)
- POJ 1511 邻接表加spfa,刚开始未用邻接表构图,然后TLE到死啊、、、、、、
- sgu 326(经典网络流构图)
- SGU 172(判定二分图)
- SGU 479 Funny Feature spfa
- UVAL 1651 Shortest Subchain(构图+spfa)
- SGU 103. Traffic Lights (SPFA)
- 摄影构图的研究
- BZOJ1715 SPFA 浅谈图论之负环的多重化判定
- 运送物资[构图+二分图最优匹配,spfa费用流]
- sgu 194 无源汇有上下界的最大流(最大流模板dinic加优化)
- dp加最短路spfa
- SGU 103 略复杂的单源最短路
- sgu 524 Buoys(三分加中位数定理)
- SGU 253 计算几何 判定点是否在凸包内
- SGU 113 Nearly prime numbers(素数判定)
- C语言基础 计算三维数组的页,行,列
- C++运算符重载
- CornerStone —— 医学影像显示的JavaScript库简介
- C++封装的高性能异步日志,cout实现方式
- 各大HotFix热补丁方案分析和比较
- SPFA的构图加判定 SGU 103
- “Bus Pass(公交车通票),ZOJ2913”的一种解法
- 整数中1出现的次数(从1到n整数中1出现的次数)
- <<matlab>>matlab高数实验准备工作
- 三维重建学习之旅(一)
- android中handler和looper的工作原理
- 极光推送
- Word Amalgamation
- HDU2009 求数列的和