最短路模板BF和SPFA,poj3259测
来源:互联网 发布:linux 内核 内存管理 编辑:程序博客网 时间:2024/06/11 21:00
分别用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;}
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");}}}
- 最短路模板BF和SPFA,poj3259测
- POJ3259 Wormholes(最短路,有无负环,spfa,模板)
- poj3259 Wormholes 最短路 spfa 负权环判断
- 最短路 SPFA模板
- 最短路 【spfa】 模板
- 最短路~spfa模板
- 最短路-SPFA 模板
- 模板-最短路//spfa
- 最短路之SPFA模板
- 最短路【SPFA】算法模板
- 最短路spfa dijkstra模板
- 最短路之SPFA模板
- 最短路SPFA算法模板
- 个人模板 最短路SPFA
- 最短路之SPFA模板
- 【NOIP模板】 最短路 spfa
- POJ 1860 Currency Exchange 最短路 BF & SPFA(bfs)
- POJ3259----Wormholes(最短路)
- 圆角ListView
- FPGA静态时序分析——IO口时序(Input Delay /output Delay)
- 《Linux内核设计的艺术》读后感
- re
- 如果你的优化手法还停留在内容加外链就危险了
- 最短路模板BF和SPFA,poj3259测
- ere
- 圆角ListView(续)
- c语言排序方法
- Linux下ALSA声卡编程
- TFTP配置
- App列表之下拉刷新
- 不同javascript加载方式对页面性能的影响
- Java HashCode作用