Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这题有什么要注意的 总是WA,大牛帮帮忙 ,,审审我的SPFA模板

Posted by mmoonzhu at 2008-07-24 22:07:50 and last updated at 2008-07-24 22:08:47
题目要求判断负环 
一部分为双向边 一部分为单向边
我用SPFA做的
对每一个顶点SPFA
当某一个顶点入队 顶点数目次 ,说明图中有负环
否则 没有负环
,,
下面是我的SPFA模板,,按原理写的 
大家看看是不是写错了

//单源最短路径 Bellman-ford优化算法 spfa 
#include<cstdio>
using namespace std;
const int maxver=1000;
const int maxlen=6000000;//整个路径的最大值 
const int maxe=maxver*maxver ;//边数的最大值 
int vernum;//顶点数目 
int enqued[maxver];//是否入队 
int quest[maxver*maxver];//边数的最大值 作为队列 
int quecnt[maxver];//顶点的入队次数 
int map[maxver][maxver];
int shortest[maxver];//最短路径值 
int pathpre[maxver];//记录前驱 
//
int spfa(int s)
{
    int i,v;
    int h,t;//队列指针 
    for(i=0;i<vernum;i++){
           shortest[i]=maxlen; pathpre[i]=-1; quecnt[i]=0;enqued[i]=0;
    }  
    h=t=0;
    enqued[s]=1; quest[t++]=s;  quecnt[s]++;
    shortest[s]=0;
    do{
        v=quest[h++]; h=h%maxe; enqued[v]=0;   
        if(quecnt[v]==vernum) return 1; //有负环 沿v的前驱必可找到一个负环 
        for(i=0;i<vernum;i++)
            if(shortest[i]>shortest[v]+map[v][i]){
                shortest[i]=shortest[v]+map[v][i];
                pathpre[i]=v;
                if(!enqued[i]){
                    quest[t++]=i;
                     t=t%maxe;
                    enqued[i]=1;  
                    quecnt[i]++;
                }   
            }          
            
    }while(h!=t);    
    return 0;
}
//
int main()
{
    int i,j;
    int n,m,w,f,s,e,t;
    int flag;
    scanf("%d",&f);
    while(f--)
    {
           scanf("%d%d%d",&n,&m,&w);
           vernum=n;
           for(i=0;i<vernum;i++)
                for(j=0;j<vernum;j++)
                    map[i][j]=maxlen;
           for(i=0;i<m;i++){
                scanf("%d%d%d",&s,&e,&t);
                map[s-1][e-1]=t;
                map[e-1][s-1]=t;   
            } 
            for(i=0;i<w;i++){
                scanf("%d%d%d",&s,&e,&t);
                t=-t;
                map[s-1][e-1]=t;   
            }
            for(i=0;i<vernum;i++){
                flag=spfa(i);
                if(flag==1) break;
            }
            if(flag==0) printf("NO\n");
            else printf("YES\n");
    }
    return 0;   
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator