(Template) to solve the shortest path Bellman-ford and SPFA (queue optimization of the former) with negative weights

// template record

 

// Bellman-ford O (V * E) s to each point shortest 
. 1
#include <cstdio> 2 #define INF 0x3f3f3f3f . 3 const int MAXN = 100 + . 5 ; . 4 const int MAXM = 10000 + . 5 ; . 5 . 6 struct Node { . 7 int U, V, W; . 8 } edge [MAXM]; . 9 10 int n-, m, X; // number of points, the number of edges, the sources . 11 int DIS [MAXN]; 12 is 13 is BOOL Bellman_ford () { 14 for(int i = 0; i < n-1; ++i) { 15 for(int j = 0; j != m; ++j) { 16 if(dis[edge[j].v] > dis[edge[j].u] + edge[j].w) { 17 dis[edge[j].v] = dis[edge[j].u] + edge[j].w; 18 } 19 } 20 } 21 bool flag = true; 22 for(int i = 0; i != m; ++i) { 23 if(dis[edge[i].v] > dis[edge[i].u] + edge[i].w) { 24 flag = false; 25 break; 26 } 27 } 28 return flag; 29 } 30 31 int main() { 32 cin >> n >> m >> x; 33 for(int i = 1; i <= n; ++i) dis[i] = INF; 34 dis[x] = 0; 35 for(int i = 0; i != m; ++i) { 36 cin >> edge[i].u >> edge[i].v >> edge[i].w; 37 if(edge[i].u == x) { 38 dis[edge[i].v] = edge[i].w; 39 } 40 } 41 if(Bellmam_ford()) cout << "have minimun road\n"; 42 else cout << "not have minimun road\n"; 43 return 0; 44 }

// poj 1860 Bellman-ford 

 1 /*
 2  * @Promlem: 
 3  * @Time Limit: ms
 4  * @Memory Limit: k
 5  * @Author: pupil-XJ
 6  * @Date: 2019-10-25 16:51:13
 7  * @LastEditTime: 2019-10-25 20:25:55
 8  */
 9 #include<cstdio>
10 #include<cstring>
11 #include<cmath>
12 #include<iostream>
13 #include<string>
14 #include<algorithm>
15 #include<iomanip>
16 #include<vector>
17 #include<queue>
18 #include<stack>
19 #include<set>
20 #include<map>
21 #define read(n) n = read_n()
22 #define rep(i, n) for(int i=0;i!=n;++i)
23 #define per(i, n) for(int i=n-1;i>=0;--i)
24 #define Rep(i, sta, n) for(int i=sta;i!=n;++i)
25 #define rep1(i, n) for(int i=1;i<=n;++i)
26 #define per1(i, n) for(int i=n;i>=1;--i)
27 #define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
28 #define L k<<1
29 #define R k<<1|1
30 #define mid (tree[k].l+tree[k].r)>>1
31 #define eps 1e-10
32 using namespace std;
33 const int INF = 0x3f3f3f3f;
34 typedef long long ll;
35 
36 inline int read_n() {
37     char c=getchar();int x=0,f=1;
38     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
39     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
40     return x*f;
41 }
42 // -----------------------------------------------------
43 const int MAXN = 100+5;
44 const int MAXM = 200+5;
45 
46 int n, m, m2, x;
47 double sta;
48 
49 struct node {
50     int u, v;
51     double r, c;
52 } edge[MAXM];
53 
54 double dis[MAXN];
55 
56 bool Bellman_ford() {
57     bool flag;
58     rep(i, n-1) {
59         flag = false;
60         rep(j, m) {
61             if(dis[edge[j].v] < (dis[edge[j].u]-edge[j].c)*edge[j].r) {
62                 dis[edge[j].v] = (dis[edge[j].u]-edge[j].c)*edge[j].r;
63                 flag = true;
64             }
65         }
66         if(!flag) break;
67     }
68     flag = false;
69     rep(i, m) {
70         if(dis[edge[i].v] < (dis[edge[i].u]-edge[i].c)*edge[i].r) {
71             return true;
72         }
73     }
74     return false;
75 }
76 
77 int main() {
78     ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
79     cin >> n >> m2 >> x >> sta;
80     m = 0;
81     rep(i, m2) {
82         cin >> edge[m].u >> edge[m].v;
83         cin >> edge[m].r >> edge[m].c;
84         ++m;
85         edge[m].u = edge[m-1].v;
86         edge[m].v = edge[m-1].u;
87         cin >> edge[m].r >> edge[m].c;
88         ++m;
89     }
90     rep1(i, n) dis[i] = 0;
91     dis[x] = sta;
92     if(Bellman_ford()) cout << "YES\n";
93     else cout << "NO\n";
94     return 0;
95 }
View Code
// SPFA O (k * E) k is the average number of the queue, typically less than 2 sparse FIG. s to each point shortest 
. 1
#include <the iostream> 2 #include <Queue> . 3 the using namespace STD; . 4 #define INF 0x3f3f3f3f . 5 const int MAXN = 100 + . 5 ; . 6 const int MAXM = 1000 + . 5 ; . 7 . 8 int NUM; . 9 int head [MAXN]; 10 struct Node { // chain star forward . 11 int V, Next; 12 is int W; 13 } edge[MAXM]; 14 15 inline void add(int x, int y, int w) { 16 edge[num].v = y; 17 edge[num].next = head[x]; 18 edge[num].w = w; 19 head[x] = num++; 20 } 21 22 int n, m; 23 int dis[MAXN], vis[MAXN], inq[MAXN]; 24 25 bool SPFA(int s) { 26 queue<int> q; 27 for(int i = 1; i <= n; ++i) { 28 dis[i] = INF; 29 vis[i] = inq[i] = 0; 30 } 31 dis[i] = 0; 32 vis[s] = inq[s] = 1; 33 q.push(s); 34 while(!q.empty()) { 35 int u = q.front(); 36 u.pop(); 37 vis[u] = 0; 38 for(int i = head[x]; i != -1; i = edge[i].next) { 39 int v = edge[i].v; 40 if(dis[v] > dis[u] + edge[i].w) { 41 dis[v] = dis[u] + edge[i].w; 42 if(!vis[v]) { 43 q.push(v); 44 vis[v] = 1; 45 ++inq[v]; 46 if(inq[v] > n) return false; 47 } 48 } 49 } 50 } 51 return true; 52 } 53 54 int main() { 55 cin >> n >> m; 56 int s, e, v; 57 num = 0; 58 for(int i = 1; i <= n; ++i) head[i] = -1; 59 for(int i = 0; i != m; ++i) { 60 cin >> s >> e >> v; 61 add(s, e, v); 62 } 63 SPFA(1); 64 return 0; 65 }

 // concept 3259

  1 /*
  2  * @Promlem: 
  3  * @Time Limit: ms
  4  * @Memory Limit: k
  5  * @Author: pupil-XJ
  6  * @Date: 2019-10-26 00:52:36
  7  * @LastEditTime: 2019-10-26 01:40:33
  8  */
  9 #include<cstdio>
 10 #include<cstring>
 11 #include<cmath>
 12 #include<iostream>
 13 #include<string>
 14 #include<algorithm>
 15 #include<iomanip>
 16 #include<vector>
 17 #include<queue>
 18 #include<stack>
 19 #include<set>
 20 #include<map>
 21 #define read(n) n = read_n()
 22 #define rep(i, n) for(int i=0;i!=n;++i)
 23 #define per(i, n) for(int i=n-1;i>=0;--i)
 24 #define Rep(i, sta, n) for(int i=sta;i!=n;++i)
 25 #define rep1(i, n) for(int i=1;i<=n;++i)
 26 #define per1(i, n) for(int i=n;i>=1;--i)
 27 #define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
 28 #define L k<<1
 29 #define R k<<1|1
 30 #define mid (tree[k].l+tree[k].r)>>1
 31 #define eps 1e-10
 32 using namespace std;
 33 const int INF = 0x3f3f3f3f;
 34 typedef long long ll;
 35 
 36 inline int read_n() {
 37     char c=getchar();int x=0,f=1;
 38     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
 39     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
 40     return x*f;
 41 }
 42 // -----------------------------------------------------
 43 const int MAXN = 500+5;
 44 const int MAXM = 5200+5;
 45 
 46 int n, m1, m2;
 47 
 48 int num;
 49 struct node {
 50     int v, next;
 51     int w;
 52 } edge[MAXM];
 53 
 54 int head[MAXN];
 55 inline void add(int x, int y, int w) {
 56     edge[num].v = y;
 57     edge[num].next = head[x];
 58     edge[num].w = w;
 59     head[x] = num++;
 60 }
 61 
 62 int dis[MAXN], vis[MAXN], inq[MAXN];
 63 
 64 bool SPFA(int s) {
 65     queue<int> q;
 66     rep1(i, n) {
 67         dis[i] = INF;
 68         vis[i] = inq[i] = 0;
 69     }
 70     dis[s] = 0;
 71     vis[s] = inq[s] = 1;
 72     q.push(s);
 73     while(!q.empty()) {
 74         int u = q.front();
 75         q.pop();
 76         vis[u] = 0;
 77         for(int i = head[u]; i != -1; i = edge[i].next) {
 78             int v = edge[i].v;
 79             if(dis[v] > dis[u] + edge[i].w) {
 80                 dis[v] = dis[u] + edge[i].w;
 81                 if(!vis[v]) {
 82                     q.push(v);
 83                     vis[v] = 1;
 84                     ++inq[v];
 85                     if(inq[v] > n) return true;
 86                 }
 87             }
 88         }
 89     }
 90     return false;
 91 }
 92 
 93 int main() {
 94     //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
 95     int T = read_n();
 96     int s, e, v;
 97     while(T--) {
 98         read(n); read(m1); read(m2);
 99         rep1(i, n) head[i] = -1;
100         num = 0;
101         rep(i, m1) {
102             read(s); read(e); read(v);
103             add(s, e, v);
104             add(e, s, v);
105         }
106         rep(i, m2) {
107             read(s); read(e); read(v);
108             add(s, e, -v);
109         }
110         if(SPFA(1)) cout << "YES\n";
111         else cout << "NO\n";
112     }
113     return 0;
114 }
View Code

 

Guess you like

Origin www.cnblogs.com/pupil-xj/p/11741662.html