想看更多的解题报告: http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有多种从a到b的汇率,在你汇钱的过程中还需要支付手续费,那么你所得的钱是 money=(nowmoney-手续费)*rate,现在问你有v钱,从s开始出发交换钱能不能赚钱
解题思路:能不能赚钱从s找一条正权回路,如果这个时候d[i]数组表示从s开始到i的最多钱,如果有一个大于v了,直接返回1,如果spfa都走完了还没找到,那么返回0
如果用bellman-ford来的话,在松弛n-1次后看有没有d[i]大于s的,有就返回1,否则返回0
- /*
- bellman_ford
- 192K 16MS
- */
- #include
- using namespace std;
- #define MAXM 410
-
- struct{
- int a,b;
- double rate,com;
- }edge[MAXM];
-
- int n,m,s;
- double v;
-
- int bellman_ford(){
- int i,j;
- double d[MAXM];
- for(i=0;i<=n;i++) d[i]=0;
- d[s]=v;
- for(i=0;i
- for(j=1;j<=2*m;j++){
- if(d[edge[j].b]<(d[edge[j].a]-edge[j].com)*edge[j].rate){
- d[edge[j].b]=(d[edge[j].a]-edge[j].com)*edge[j].rate;
- }
- }
- }
- for(j=1;j<=2*m;j++){
- if(d[edge[j].b]<(d[edge[j].a]-edge[j].com)*edge[j].rate){
- return 1;
- }
- }
- return 0;
- }
-
- int main(){
- int i;
- while(~scanf("%d%d%d%lf",&n,&m,&s,&v)){
- for(i=1;i<=2*m;i+=2){
- scanf("%d%d%lf%lf%lf%lf",&edge[i].a,&edge[i].b,&edge[i].rate,&edge[i].com,&edge[i+1].rate,&edge[i+1].com);
- edge[i+1].a=edge[i].b;
- edge[i+1].b=edge[i].a;
- }
- if(bellman_ford())
- printf("YES\n");
- else
- printf("NO\n");
- }
- return 0;
- }
=================================================================================
- /*208K 16MS */
- #include
- #include
- using namespace std;
- #define MAXM 410
- #define inf 1e-8
-
- struct{
- int a,b,next;
- double rate,com;
- }edge[MAXM];
-
- int n,m,s,headlist[MAXM];
- double v;
-
- int spfa(){
- double d[MAXM];
- int i,t,vis[MAXM];
- queue <int>q;
- for(i=1;i<=n;i++){
- d[i]=0;
- vis[i]=0;
- }
-
- q.push(s);
- vis[s]=1;
- d[s]=v;
- while(!q.empty()){
- t=q.front();
- q.pop();
- vis[t]=0;
-
- for(i=headlist[t];i!=-1;i=edge[i].next){
- if(d[edge[i].b]<(d[t]-edge[i].com)*edge[i].rate){
- d[edge[i].b]=(d[t]-edge[i].com)*edge[i].rate;
- if(!vis[edge[i].b]){
- q.push(edge[i].b);
- vis[edge[i].b]=1;
- }
- }
- }
- if(d[s]>v) return 1;
- }
- return 0;
- }
-
- int main(){
- int i;
- while(~scanf("%d%d%d%lf",&n,&m,&s,&v)){
- for(i=1;i<=n;i++) headlist[i]=-1;
- for(i=1;i<=2*m;i+=2){
- scanf("%d%d%lf%lf%lf%lf",&edge[i].a,&edge[i].b,&edge[i].rate,&edge[i].com,&edge
-
- [i+1].rate,&edge[i+1].com);
- edge[i+1].a=edge[i].b;
- edge[i+1].b=edge[i].a;
-
- edge[i].next=headlist[edge[i].a];
- headlist[edge[i].a]=i;
-
- edge[i+1].next=headlist[edge[i].b];
- headlist[edge[i].b]=i+1;
- }
- if(spfa())
- printf("YES\n");
- else
- printf("NO\n");
- }
- return 0;
- }
注:本文转载自blog.csdn.net的wangjian8006的文章"http://blog.csdn.net/wangjian8006/article/details/7871753"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
评论记录:
回复评论: