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 |
求解释1.写SPFA,用样例得到的答案是4,debug了一下后发现,可能是因为在变长相等时没有进行更新而导致后面没有更新dist值的max。于是就在一开始使所有点都入队。 我的问题是,什么情况下需要这样做,什么情况下只需要入队一个点就可以了? 代码:(比较喜欢敲回车~) #include<stdio.h> int first[500005],next[500005],cc[500005],value[500005],cnt=0; void add(int a,int b,int c) { int t; if(!first[a]) { first[a]=++cnt; cc[cnt]=b; value[cnt]=c; } else { t=first[a]; while(next[t]) t=next[t]; next[t]=++cnt; cc[cnt]=b; value[cnt]=c; } } int v[50005],queue[10000000],dist[50005]={0}; int main() { int n; int x,y,z,t; int i,m=0; int begin=1,end; scanf("%d",&n); for(i=0;i<=50000;i++) { add(i,i+1,0); add(i+1,i,-1); } for(i=1;i<=n;i++) { scanf("%d%d%d",&x,&y,&z); if(x>y) { t=x; x=y; y=t; } if(y>m) m=y; x-=1; add(x,y,z); } for(i=0;i<=m;i++) { queue[i+1]=i; v[i]=1; } end=m+1; while(begin<=end) { x=queue[begin++]; v[x]=0; for(i=first[x];i;i=next[i]) { if(dist[x]+value[i]>dist[cc[i]]) { dist[cc[i]]=value[i]+dist[x]; if(!v[cc[i]]) { v[cc[i]]=1; queue[++end]=cc[i]; } } } } printf("%d",dist[m]); system("pause"); } 2.求解释“差分约束系统”这个名字。 Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator