Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴个bell-man-ford和spfa 大家交流下哈...bellman-ford: /* * Author: kymo * Created Time: 2011/7/23 15:49:21 * File Name: bellman-ford.cpp */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string.h> #include <cstdlib> #include <algorithm> #include <vector> using namespace std; #define F(a,b) for(int i = a;i <= b;i ++) #define int_max 99999999999LL #define eps 1.0e-6 #define max 5240 #define inf 100000 int d[max]; int edge; struct node{ int u,v; int val; }Node[max]; int n,e,m; bool bellman_ford(int s){ for(int j = 0;j <= n-1;j ++){ d[j] = inf; } d[s] = 0; int flag = 0; for(int t = 0;t <= n-2;t ++){ for(int j = 0;j <= edge-1;j ++){ if(d[Node[j].u] != inf&&d[Node[j].u] + Node[j].val < d[Node[j].v]){ d[Node[j].v] = d[Node[j].u] + Node[j].val; } } } for(int j = 0;j <= edge-1;j ++){ if(d[Node[j].u] + Node[j].val < d[Node[j].v]){ flag = 1; break; } } if(flag) return false; else return true; } int T; int a,b,c; int main() { cin>>T; for(int i = 0;i <= T-1;i ++){ scanf("%d%d%d",&n,&e,&m); edge = 0; for(int j = 0;j <= e-1;j ++){ scanf("%d%d%d",&a,&b,&c); Node[edge].u = a-1; Node[edge].v = b-1; Node[edge].val = c; edge ++; Node[edge].u = b-1; Node[edge].v = a-1; Node[edge].val = c; edge ++; } for(int j = 0;j <= m-1;j ++){ scanf("%d%d%d",&a,&b,&c); Node[edge].u = a-1; Node[edge].v = b-1; Node[edge].val = -1*c; edge ++; } if(bellman_ford(0)) printf("NO\n"); else printf("YES\n"); } return 0; } spfa: /* * Author: kymo * Created Time: 2011/7/24 10:04:02 * File Name: 3259-spfa.cpp */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string.h> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <vector> using namespace std; #define F(a,b) for(int i = a;i <= b;i ++) #define int_max 99999999999LL #define eps 1.0e-6 #define inf 99999999 #define max 520 int n,m,w; int a,b,c; int d[max]; int cnt[max]; int vis[max]; struct node{ int v; int val; }E; vector<node> Node[max+2]; int spfa(int k){ for(int j = 1;j <= n;j ++){ d[j] = inf; cnt[j] = 0; vis[j] = 0; } d[k] = 0; vis[k] = 1; cnt[k] = 1; queue<int> some; some.push(k); while(!some.empty()){ int tp = some.front(); some.pop(); int size = Node[tp].size(); vis[tp] = 0; for(int j = 0;j <= size-1;j ++){ E = Node[tp][j]; if(d[E.v] - E.val > d[tp]){ d[E.v] = E.val + d[tp]; if(!vis[E.v]){ vis[E.v] = 1; cnt[E.v] ++; if(cnt[E.v] >= n) return 0; some.push(E.v); } } } } return 1; } int main() { int T; scanf("%d",&T); for(int TT = 0;TT <= T-1;TT ++){ scanf("%d%d%d",&n,&m,&w); for(int j = 1;j <= n;j ++){ Node[j].clear(); } for(int j = 0;j <= m-1;j ++){ scanf("%d%d%d",&a,&b,&c); E.v = b; E.val = c; Node[a].push_back(E); E.v = a; E.val = c; Node[b].push_back(E); } for(int j = 0;j <= w-1;j ++){ scanf("%d%d%d",&a,&b,&c); E.v = b; E.val = -c; Node[a].push_back(E); } int ret = 0; if(spfa(1)) ret = 1; if(!ret) printf("YES\n"); else printf("NO\n"); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator