| ||||||||||
| 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 | |||||||||
题解
如果把手上的货币种类不同看成不同的状态(可以证明最优解存在时一定是每次都把本钱全部投入的),不同的交易方式看成状态迁移的路径,那么这道题等价于在directed multigraph中的回路检验。
算法:Bellman-ford
着色版代码:http://ideone.com/W9kMG
//POJ 1860
#include <stdio.h>
#include <assert.h>
struct Edge{
int src, dest;
double r, c;
} edges[200]; // Direct Multigraph, each input line = 2 edges
double vertices[100]; // amount of currency, information of parent is not important
int N, B, S;
double V;
double max( double a, double b ){ return (a>b)? a:b; }
int hasCircle(){ // Bellman Ford
int i, j;
for( i=0; i<N-1; i++ ){
for( j=0; j<2*B; j++ ){ // 2*B!
vertices[edges[j].dest] = max( vertices[edges[j].dest], (vertices[edges[j].src] - edges[j].c) * edges[j].r );
}
}
for( j=0; j<2*B; j++ ){
if( vertices[edges[j].dest] < (vertices[edges[j].src] - edges[j].c) * edges[j].r ){ return 1; }
}
return 0;
}
void init(){
int i;
for( i=0; i<B; i++ ){ vertices[i]=0; }
vertices[S-1] = V;
}
void read(){
scanf("%d%d%d%lf", &N, &B, &S, &V);
int i;
for( i=0; i<B; i++ ){
int a, b;
double r1, c1, r2, c2;
scanf("%d%d%lf%lf%lf%lf", &a, &b, &r1, &c1, &r2, &c2);
edges[2*i].src=a-1; edges[2*i].dest=b-1; edges[2*i].r=r1; edges[2*i].c=c1;
edges[2*i+1].src=b-1; edges[2*i+1].dest=a-1; edges[2*i+1].r=r2; edges[2*i+1].c=c2;
}
}
int main(){
read();
init();
if( hasCircle() == 1 ){
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