| ||||||||||
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 |
我一直RE,求解决,在别的OJ上都过了,希望大神解释一下我用的是spfa,虚拟节点0向从1时刻开始工作的牛建权值为1的边,最后spfa,输出结束工作时刻为T的点最短路的最小值。 #include<iostream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; struct u { int d; int a; int b; }cdr[25010]; struct uu { int b; int x; }c[5000000]; bool b[25010],by[25010]; int T,n,l; queue<int>q; int h[25010]; int pr=0x7fffffff; int z[25010]; inline void gj(int a,int b) { c[++l].b=b; c[l].x=h[a]; h[a]=l; } inline bool g(const u & aa,const u & bb) { return aa.a<bb.a; } int main() { scanf("%d%d",&n,&T); for(int i=1;i<=n;i++) { z[i]=0x3fffffff; cdr[i].d=i; scanf("%d%d",&cdr[i].a,&cdr[i].b); if(cdr[i].a==1) gj(0,i); if(cdr[i].b==T) by[i]=1; } sort(cdr+1,cdr+1+n,g); for(int i=1;i<=n;i++) for(int y=i+1;y<=n&&cdr[y].a<=cdr[i].b+1;y++) gj(cdr[i].d,cdr[y].d); b[0]=1; q.push(0); while(!q.empty()) { int k=q.front(); q.pop(); b[k]=0; if(z[k]>pr) continue; for(int i=h[k];i;i=c[i].x) { int u=c[i].b; if(z[u]>z[k]+1) { z[u]=z[k]+1; if(!b[u]) { b[u]=1; q.push(u); } if(by[u]&&z[u]<pr) { pr=z[u]; } } } } if(pr>n) pr=-1; printf("%d",pr); /*getchar(); getchar();*/ } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator