标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 23346 | Accepted: 8450 |
Description
Input
Output
Sample Input
3 2 1 20.0 1 2 1.00 1.00 1.00 1.00 2 3 1.10 1.00 1.10 1.00
Sample Output
YES
题意:某种货币经过转换后是否可以增值。
判断是否含有正环。
Bellmen_Ford方法实现:
遍历途中所有的边(edge(u,v)),判断是否存在这样情况:
d(v) > d (u) + w(u,v)
则返回false,表示途中存在从源点可达的权为负的回路。
初始化d(S)=V 而源点到其他店的距离(权值)初始化为无穷小(0), 当s到其他某点的距离能不断变大时,说明存在最大路径
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 #define N 1100 9 #define INF 0xfffffff 10 11 int n, m, s, cnt = 0; 12 double sum; 13 14 double dist[N]; 15 16 struct node 17 { 18 int u, v, next; 19 double c, r; 20 }e[N*4]; 21 22 void add(int u, int v, double r, double c) 23 { 24 e[cnt].u = u; 25 e[cnt].v = v; 26 e[cnt].c = c; 27 e[cnt].r = r; 28 cnt++; 29 } 30 31 int slove() 32 { 33 for(int i = 1; i <= n; i++) 34 dist[i] = 0; 35 36 dist[s] = sum; 37 int i; 38 for(i = 1; i <= n; i++) 39 { 40 int flag = 0; 41 for(int j = 0; j < cnt; j++) 42 { 43 if(dist[e[j].v] < (dist[e[j].u]-e[j].c)*e[j].r) 44 { 45 dist[e[j].v] = (dist[e[j].u]-e[j].c)*e[j].r; 46 flag = 1; 47 } 48 } 49 if(!flag) 50 break; 51 } 52 if(i == n+1) 53 return true; 54 return false; 55 } 56 57 int main() 58 { 59 scanf("%d%d%d%lf", &n, &m, &s, &sum); 60 int u, v; 61 double cu, ru, cv, rv; 62 63 while(m--) 64 { 65 scanf("%d%d%lf%lf%lf%lf", &u, &v, &cu, &ru, &cv, &rv); 66 add(u, v, cu, ru); 67 add(v, u, cv, rv); 68 } 69 if(slove()) 70 printf("YES\n"); 71 else 72 printf("NO\n"); 73 return 0; 74 }
spfa:
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <queue> 5 #define maxn 107 6 #define inf 0x7fffffff 7 #define eps 1e-8 8 using namespace std; 9 int ct[maxn]; 10 double r[maxn][maxn],c[maxn][maxn],dis[maxn],v; 11 bool visit[maxn]; 12 int n,m,s; 13 bool spfa() 14 { 15 queue<int>q; 16 while (!q.empty()) q.pop(); 17 dis[s] = v; 18 q.push(s); 19 visit[s] = true; ct[s]++;//ct统计入队次数 20 while (!q.empty()) 21 { 22 int u = q.front(); q.pop(); 23 for (int i = 1; i <= n; ++i) 24 { 25 if ( (dis[u] - c[u][i])*r[u][i] - dis[i] > eps) 26 { 27 dis[i] = (dis[u] - c[u][i])*r[u][i];28 29 if (!visit[i])//判断是否在队列中,然后入队 30 { 31 visit[i] = true; 32 q.push(i); 33 if (++ct[i] > n) return true; 34 } 35 } 36 } 37 visit[u] = false;//把根节点标为未入队,因为后面的节点可能还会更新他这是与bfs的区别 38 } 39 if (dis[s] - v > eps) return true; 40 else return false; 41 } 42 int main() 43 { 44 int i,j; 45 for (i = 0; i < maxn; ++i) 46 { 47 visit[i] = false; 48 ct[i] = 0; dis[i] = 0; 49 for (j = 0; j < maxn; ++j) 50 { 51 r[i][j] = c[i][j] = 0; 52 } 53 } 54 scanf("%d%d%d%lf",&n,&m,&s,&v); 55 int a,b; 56 for (i = 0; i < m; ++i) 57 { 58 scanf("%d%d",&a,&b); 59 scanf("%lf%lf%lf%lf",&r[a][b],&c[a][b],&r[b][a],&c[b][a]);//建图 60 } 61 if (spfa()) printf("YES\n"); 62 else printf("NO\n"); 63 64 }
标签:
原文地址:http://www.cnblogs.com/Tinamei/p/4794825.html