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 |
Re:FOXLIU的好方法,让我过了In Reply To:请问下有没有哪位朋友用spfa过的?代码借看下。 Posted by:sword_snow at 2010-07-02 15:08:37 > 我的总是WA > #include<iostream> > using namespace std; > #include<cmath> > #include<algorithm> > #include<cstring> > #include<stdio.h> > #include<string> > #include<map> > #include<set> > #include<queue> > double rate[101][101],c[101][101],r1,r2,c1,c2; > double d[101]; > double vs; > #define eps 1e-8 > bool relax(int u,int v) > { > if (d[v]+eps<(d[u]-c[u][v])*rate[u][v]){ > d[v]=(d[u]-c[u][v])*rate[u][v]; > return true; > } > else return false; > } > bool spfa(int s,int n) > { > int f=0,r=1,p=1,i,j; > int q[101],t[101]; > bool in[101]; > memset(in,false,sizeof(in)); > memset(t,0,sizeof(t)); > q[1]=s; > in[s]=true; > t[s]++; > while (f!=r) > { > f=f%n+1; > int front=q[f]; > in[front]=false; > for (i=1;i<=n;i++) > if ((!in[i])&&rate[front][i]>eps) > { > if (relax(front,i)) { > in[i]=true,r=r%n+1,q[r]=i,t[i]++; > if (i==s) return false; > } > if (t[i]>n) return false; > } > } > if (d[s]>vs+eps) return false; > else return true; > } > int main(){ > int i,j,n,m,s,a,b; > memset(d,0,sizeof(d)); > memset(rate,0,sizeof(rate)); > memset(c,0,sizeof(c)); > scanf("%d",&n); > scanf("%d",&m); > scanf("%d",&s); > scanf("%lf",&vs); > //cout<<v; > for (i=0;i<m;i++) > { > scanf("%d %d",&a,&b); > scanf("%lf %lf %lf %lf",&r1,&c1,&r2,&c2); > rate[a][b]=r1;rate[b][a]=r2;c[a][b]=c1;c[b][a]=c2; > } > d[s]=vs; > if (spfa(s,n)) cout<<"NO\n"; > else cout<<"YES\n"; > return 0; > } #include <cstdio> #include <queue> using namespace std; #define EXPNTNUM (100 + 10) #define CURNUM (100 + 10) struct Node { int to; Node* next; double commission, ratio; }; Node nodeHead[CURNUM + 1]; Node edge[EXPNTNUM * 2 + 2]; int pos = 0; Node* getEdge() { return edge + pos++; } double maxWeight[CURNUM + 1]; void addEdge(int from, int to, double ratio, double commission) { Node* e = getEdge(); Node* n = nodeHead + from; e->to = to; e->ratio = ratio; e->commission = commission; e->next = n->next; n->next = e; } int main() { int currencyNum, pointNum, currencyNumHas; int i, j, a, b; double ratioab, ratioba, comab, comba; double currencisHas; scanf("%d%d%d%lf", ¤cyNum, &pointNum, ¤cyNumHas, ¤cisHas); for (i = 1; i <= currencyNum; ++i) { maxWeight[i] = 0; nodeHead[i].next = NULL; } for (i = j = 0; i < pointNum; ++i) { scanf("%d%d", &a, &b); scanf("%lf%lf%lf%lf", &ratioab, &comab, &ratioba, &comba); addEdge(a, b, ratioab, comab); addEdge(b, a, ratioba, comba); } maxWeight[currencyNumHas] = currencisHas; queue<int> q; q.push(currencyNumHas); int maxEdgeCount = 0; while (true) { int u = q.front(); q.pop(); for (Node* tra = nodeHead[u].next; tra != NULL; tra = tra->next) { double temp = (maxWeight[u] - tra->commission) * tra->ratio; if (maxWeight[tra->to] < temp) { maxWeight[tra->to] = temp; q.push(tra->to); } } maxEdgeCount++; if (maxWeight[currencyNumHas] > currencisHas) { printf("YES\n"); break; } if (q.empty()) { printf("NO\n"); break; } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator