Bellman_ford 边表示
2017-11-26 18:15
99 查看
一、Edge边表示、判断负环
注意这里的图一般用有向图表示 也就是说 1 - 2, 2 - 1 如果权重为负值 那么 也算有负权环(这里表示了添加两条边的方法)
这里因为添加双向边 则 一旦有负w出现就会认为是负权环
import java.util.Scanner;
public class Main {
static Edge []edges;
static boolean []visit;
static int n, m;
static int tol;
static int[]dis;
static int INF = 9999999;
static int[]head;
static boolean hasNegCycle = false;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
n = in.nextInt();
m = in.nextInt();
if(n == 0 && m == 0)
break;
edges = new Edge[2*m+1];
for(int i = 1; i <= 2*m; i++ )
edges[i] = new Edge();
tol = 1;
head = new int[n+1];
dis = new int[n+1];
for(int i = 1; i <= n; i++ )
head[i] = -1;
for(int i = 1; i <= m; i++ ) {
int u = in.nextInt();
int v = in.nextInt();
int w = in.nextInt();
add(u, v, w);
add(v, u, w);
}
bell_man();
if(!hasNegCycle) {
System.out.println(dis
);
}
else
System.out.println("hasNegtiveCycle");
// for(int i = 1; i < tol; i++ ) {
// Edge e = edges[i];
// System.out.println(e.from + " " + e.to + " " + e.w);
// }
}
}
public static void bell_man() {
for(int i = 1; i <= n; i++ ) {
dis[i] = (i == 1) ? 0 : INF;
}
for(int i = 1; i < n; i++ ) {
int flag = 0;
for(int j = 1; j <= 2*m; j++ ) {
Edge e = edges[j];
if(dis[e.to] > dis[e.from] + e.w) {
flag = 1;
dis[e.to] = dis[e.from] + e.w;
}
}
if(flag == 0)
break;
}
hasNegCycle = false;
for(int i = 1; i <= 2*m; i++ ) {
Edge e = edges[i];
if(dis[e.to] > dis[e.from] + e.w) {
hasNegCycle = true;
break;
}
}
}
public static void add(int from, int to, int w) {
edges[tol].from = from;
edges[tol].to = to;
edges[tol].w = w;
edges[tol].next = head[from];
head[from] = tol++;
}
}
class Edge{
int from, to;
int w;
int next;
// public Edge(int from, int to) {
// this.from = from;
// this.to = to;
// this.w = w;
// }
}
注意这里的图一般用有向图表示 也就是说 1 - 2, 2 - 1 如果权重为负值 那么 也算有负权环(这里表示了添加两条边的方法)
这里因为添加双向边 则 一旦有负w出现就会认为是负权环
import java.util.Scanner;
public class Main {
static Edge []edges;
static boolean []visit;
static int n, m;
static int tol;
static int[]dis;
static int INF = 9999999;
static int[]head;
static boolean hasNegCycle = false;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
n = in.nextInt();
m = in.nextInt();
if(n == 0 && m == 0)
break;
edges = new Edge[2*m+1];
for(int i = 1; i <= 2*m; i++ )
edges[i] = new Edge();
tol = 1;
head = new int[n+1];
dis = new int[n+1];
for(int i = 1; i <= n; i++ )
head[i] = -1;
for(int i = 1; i <= m; i++ ) {
int u = in.nextInt();
int v = in.nextInt();
int w = in.nextInt();
add(u, v, w);
add(v, u, w);
}
bell_man();
if(!hasNegCycle) {
System.out.println(dis
);
}
else
System.out.println("hasNegtiveCycle");
// for(int i = 1; i < tol; i++ ) {
// Edge e = edges[i];
// System.out.println(e.from + " " + e.to + " " + e.w);
// }
}
}
public static void bell_man() {
for(int i = 1; i <= n; i++ ) {
dis[i] = (i == 1) ? 0 : INF;
}
for(int i = 1; i < n; i++ ) {
int flag = 0;
for(int j = 1; j <= 2*m; j++ ) {
Edge e = edges[j];
if(dis[e.to] > dis[e.from] + e.w) {
flag = 1;
dis[e.to] = dis[e.from] + e.w;
}
}
if(flag == 0)
break;
}
hasNegCycle = false;
for(int i = 1; i <= 2*m; i++ ) {
Edge e = edges[i];
if(dis[e.to] > dis[e.from] + e.w) {
hasNegCycle = true;
break;
}
}
}
public static void add(int from, int to, int w) {
edges[tol].from = from;
edges[tol].to = to;
edges[tol].w = w;
edges[tol].next = head[from];
head[from] = tol++;
}
}
class Edge{
int from, to;
int w;
int next;
// public Edge(int from, int to) {
// this.from = from;
// this.to = to;
// this.w = w;
// }
}
相关文章推荐
- POJ-3259 Wormholes(负权回路[Bellman-Ford])
- matlab练习程序(单源最短路径Bellman-Ford)
- 图论: bellman_ford 求单源最短路…
- POJ 1860 Currency Exchange 毫无优化的bellman_ford跑了16Ms,spfa老是WA。。
- Frogger POJ - 2253 最短路变形 Bellman-Ford
- poj 2240(bellman_ford 算法)(最短路负权)Arbitrage
- HDU 1874 (最短路 ---Bellman_Ford)
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 6.3--负权边 Bellman-Ford
- Bellman-ford algorithm to find the shortest path
- Bellman-Ford——解决负权边(求某点到所有点的最短距离)
- Bellman-Ford队列优化(邻接表)
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- poj_2240 Arbitrage(Bellman_ford + map)
- hdu 2544 【总结】 Dijkstra,Bellman-Ford ,SPFA 最短路求法及对应优化
- bellman-ford的一般形式(下一站:spfa)
- 【UVA2031】cycle {二分+spfa/Bellman ford}
- #初学#POJ 1860 Currency Exchange【bellman_ford判断是否有正环——基础入门】
- Bellman-Ford 算法及其优化(转) 收藏
- hdoj1317-XYZZY(floyd + bellman_ford)