| ||||||||||
| 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 | |||||||||
POJ2983差分约束用SPFA来做怎么做呀?RT
好心人给个代码
我的图直接是原来的图,不加任何节点,每个节点赋初值0,每个节点初始都进队列,
我的开始是是判定到如有某个点被松弛V(顶点数)次,就判定负环,WA
结果加了一个判断过程:
再队列为空的情况下(应该就没负环了),
出了SPFA以后,再来一次对所有边遍历,看有没有可松弛的,有的话就判负
居然AC了
然后再次在其中改代码,该到如果有点可松弛,比如从u指向v有路径可松弛,就看u点是否在队列
中,如果不在,就输出1/0(我要看RE),还真RE了!
怪了,不在队列里还能松弛别得点,搞了整整半天搞不懂,急求指教,或者一个SPFA判负环AC得程序。
我附上我代码:
#include <stdio.h>
#include <stdlib.h>
struct stct0{
int u,v;
long w;
}l[200010];
int n;
long m;
int q[1100],inq[1001],reti[1001];
long d[1001],adjg[1001][1000];
main(){
char typch;
int i,a,b,head,tail,flag;
long j,c,index;
while(scanf("%d%ld",&n,&m)!=EOF){
for(i=1;i<=n;i++){
q[i-1]=i;
adjg[i][0]=0;
inq[i]=1;
reti[i]=0;
d[i]=0;
}//init
j=0;
while(m--){
getchar();
scanf("%c",&typch);
if(typch=='P'){
scanf("%d%d%ld",&a,&b,&c);
l[j].v=a;
l[j].u=b;
l[j].w=-c;
adjg[b][0]++;
adjg[b][adjg[b][0]]=j;
j++;
l[j].v=b;
l[j].u=a;
l[j].w=c;
adjg[a][0]++;
adjg[a][adjg[a][0]]=j;
j++;
}else{
scanf("%d%d",&a,&b);
l[j].v=a;
l[j].u=b;
l[j].w=-1;
adjg[b][0]++;
adjg[b][adjg[b][0]]=j;
j++;
}
}
head=0;
tail=n;
flag=1;
while(head!=tail&&flag){
for(i=adjg[q[head]][0];i>=1;i--){
index=adjg[q[head]][i];
if(d[l[index].v]>d[l[index].u]+l[index].w){
reti[l[index].v]++;
d[l[index].v]=d[l[index].u]+l[index].w;
if(!inq[l[index].v]){
q[tail]=l[index].v;
inq[l[index].v]=1;
tail++;
tail%=1100;
}
if(reti[l[index].v]==n){
flag=0;
break;
}//negative circle occured
}//relax & time
}
inq[q[head]]=0;
head++;
head%=1100;
}
//加的下面这块
if(flag){
for(i=1;i<=n;i++){
for(j=adjg[i][0];j>=1;j--){
if(d[l[adjg[i][j]].v]>d[l[adjg[i][j]].u]+l[adjg[i][j]].w){
if(!inq[d[l[adjg[i][j]].u]]){
printf("%d",1/(i-i));//要RE得
}
flag=0;
break;
}
}
if(!flag)
break;
}
}
//加的上面这块
if(flag)
printf("Reliable\n");
else
printf("Unreliable\n");
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator