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

g++ spfa 试着判了有没有联通什么的 留下代码做纪念

Posted by xuesu at 2014-07-23 09:57:30 on Problem 3259
//poj3259
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int MAXN=501;
const int inf=0x3ffffff;
vector<int>G[MAXN];
int n,m,w;
queue <int >que;
int times[MAXN];
int d[MAXN];
int cost[MAXN][MAXN];
bool find_negative_loop(int start){
    if(times[start]!=0)return false;
    memset(times,0,sizeof(times));
    que.push(start);
    d[start]=0;
    times[start]=1;
    while(!que.empty()){
        int from=que.front();que.pop();
        int len=G[from].size();
        for(int i=0;i<len;i++){
            int to=G[from][i];
            if(d[to]>d[from]+cost[from][to]){
                d[to]=d[from]+cost[from][to];
                que.push(to);
                times[to]++;
                if(times[to]>=n)return true;
            }
        }
    }
    return false;
}
int main(){
        int f;
        scanf("%d",&f);
        while(f--){
            scanf("%d %d %d",&n,&m,&w);
            for(int i=0;i<=n;i++)fill(cost[i],cost[i]+n+1,inf);
            memset(times,0,sizeof(times));
            for(int i=0;i<m;i++){
                    int from,to,tcost;
                    scanf("%d %d %d",&from,&to,&tcost);
                    G[from].push_back(to);
                    cost[from][to]=min(cost[from][to],tcost);
                    G[to].push_back(from);
                    cost[to][from]=min(cost[to][from],tcost);
            }
            for(int i=0;i<w;i++){
                    int from,to,tcost;
                    scanf("%d %d %d",&from,&to,&tcost);
                    G[from].push_back(to);
                    cost[from][to]=min(cost[from][to],-tcost);
            }
            bool fl=false;
            for(int i=1;i<=n;i++){
                fill(d,d+n+1,inf);
                fl=find_negative_loop(i);
                if(fl)break;
            }
            if(fl)printf("YES\n");
            else printf("NO\n");
        }
}

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