最短路模板BF和SPFA,poj3259測

來源:互聯網
上載者:User

分別用BF和SPFA處理帶負權圖,自己寫的模板,哎也WA 了N多次呀,測試題目是poj3259

Bellman-ford:

#include <iostream>#include <cstdio>#include <cstring>#define MAX 1<<28using namespace std;const int maxn=7010;int N,M,W;int dis[maxn];int edgenum;struct Edge{int st,ed;int val;}edge[maxn];void addedge(int st,int en,int w){edgenum++;edge[edgenum].st=st;edge[edgenum].ed=en;edge[edgenum].val=w;}bool bellman_Ford(int start){memset(dis,MAX,sizeof(dis));dis[start]=0;for(int i=1;i<N;i++){for(int j=1;j<=edgenum;j++){int st=edge[j].st;int en=edge[j].ed;int w=edge[j].val;if(dis[en]>dis[st]+w)dis[en]=dis[st]+w;}}//判斷是否存在負環for(int j=1;j<edgenum;j++){if(dis[edge[j].ed]>dis[edge[j].st]+edge[j].val){return true;}}return false;}int main() {int NUM;scanf("%d",&NUM);while(NUM--){scanf("%d%d%d",&N,&M,&W);edgenum=0;for(int i=1;i<=M;i++){int a,b,v;scanf("%d%d%d",&a,&b,&v);addedge(a,b,v);addedge(b,a,v);}for(int i=1;i<=W;i++){int a,b,v;scanf("%d%d%d",&a,&b,&v);addedge(a,b,-v);}if(bellman_Ford(1))printf("YES\n");elseprintf("NO\n");}return 0;}

BF(java):

import java.util.Arrays;import java.util.Scanner;public class Main {static int maxn=7010;static int dis[]=new int[maxn];static int Max=10000000;static int node;class Edge{int st,ed;int val;Edge(int st,int ed,int val){this.st=st;this.ed=ed;this.val=val;}} Edge data[]=new Edge[maxn];static int edgenum;void addedge(int st,int ed,int val){edgenum++;data[edgenum]=new Edge(st,ed,val);}boolean bellman_ford(int start){Arrays.fill(dis, Max);dis[start]=0;for(int i=1;i<node;i++)for(int j=1;j<=edgenum;j++){if(dis[data[j].ed]>dis[data[j].st]+data[j].val)dis[data[j].ed]=dis[data[j].st]+data[j].val;}for(int j=1;j<edgenum;j++)if(dis[data[j].ed]>dis[data[j].st]+data[j].val)return false;return true;} void run(){Scanner in=new Scanner(System.in);int casenum=in.nextInt();while(casenum--!=0){node=in.nextInt();int M=in.nextInt();int W=in.nextInt();edgenum=0;for(int i=1;i<=M;i++){int a=in.nextInt();int b=in.nextInt();int val=in.nextInt();addedge(a,b,val);addedge(b,a,val);}for(int i=1;i<=W;i++){int a=in.nextInt();int b=in.nextInt();int val=in.nextInt();addedge(a,b,-val);}if(bellman_ford(1))System.out.println("NO");elseSystem.out.println("YES");}}public static void main(String[] args) {new Main().run();}}

SPFA

//============================================================================// Name        : SPFA.cpp// Author      : xinge// Version     :矩陣存圖// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>#include <cstring>#include <cstdio>#include <queue>#include <set>#define MAX 1<<28;using namespace std;const int maxn=1010;int map[maxn][maxn];int dis[maxn];int cnt[maxn];bool used[maxn];int node;void init(){for(int i=0;i<maxn;i++){dis[i]=MAX;used[i]=false;cnt[i]=0;for(int j=0;j<maxn;j++)map[i][j]=MAX;map[i][i]=0;}}bool SPFA(int start){cnt[start]++;used[start]=true;dis[start]=0;queue<int> q;q.push(start);int cur;while(!q.empty()){cur=q.front();q.pop();used[cur]=false;for(int i=1;i<=node;i++){if(map[cur][i]&&dis[i]>dis[cur]+map[cur][i]){dis[i]=dis[cur]+map[cur][i];if(!used[i]){cnt[i]++;used[i]=true;q.push(i);if(cnt[i]>node)return false;}}}}return true;}int main() {int T,M,W;scanf("%d",&T);while(T--){scanf("%d%d%d",&node,&M,&W);init();for(int i=1;i<=M;i++){int a,b,v;scanf("%d%d%d",&a,&b,&v);if(map[a][b]>v)map[a][b]=map[b][a]=v;}for(int i=1;i<=W;i++){int a,b,v;scanf("%d%d%d",&a,&b,&v);if(map[a][b]>-v)map[a][b]=-v;}if(SPFA(1)){printf("NO\n");}elseprintf("YES\n");}return 0;}

SPFA  java

import java.util.ArrayList;import java.util.Scanner;public class Main{static int MAX=1<<29;static int map[][]=new int[1010][1010];static int node;static int dis[]=new int[1010];static boolean used[]=new boolean[1010];static int cnt[]=new int[1010];static void init(){for(int i=0;i<1010;i++){dis[i]=MAX;used[i]=false;cnt[i]=0;for(int j=0;j<1010;j++)map[i][j]=MAX;map[i][i]=0;}}static boolean relax(int a,int b,int c){if(dis[b]>dis[a]+c){return true;}return false;}static boolean SPFA(int start){used[start]=true;cnt[start]++;dis[start]=0;ArrayList<Integer>lis=new ArrayList<Integer>();lis.add(start);int cur;while(!lis.isEmpty()){cur=lis.remove(0);used[cur]=false;for(int i=1;i<=node;i++){if(map[cur][i]!=0&&relax(cur,i,map[cur][i])){dis[i]=dis[cur]+map[cur][i];if(!used[i]){used[i]=true;lis.add(i);cnt[i]++;if(cnt[i]>node)return false;}}}}return true;}public static void main(String[] args) {Scanner in=new Scanner(System.in);int casenum=in.nextInt();while(casenum--!=0){node=in.nextInt();int M=in.nextInt();int W=in.nextInt();init();for(int i=1;i<=M;i++){int a=in.nextInt();int b=in.nextInt();int val=in.nextInt();if(map[a][b]>val)map[a][b]=map[b][a]=val;}for(int i=1;i<=W;i++){int a=in.nextInt();int b=in.nextInt();int val=in.nextInt();if(map[a][b]>-val)map[a][b]=-val;}if(SPFA(1))System.out.println("NO");elseSystem.out.println("YES");}}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.