程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU OJ 4318 Power transmission [最短路spfa]

HDU OJ 4318 Power transmission [最短路spfa]

編輯:C++入門知識

題意:有一個發電站 s ,將電傳送至  t , 有 許多路線可以走,每走 一條路 有損失,求埙失的最小值。
思路:(1)轉化為 最短路問題,損失 = max- max*(1-a%)*(1-b%)……*(1-%n)(假設任意一條路線);
             (2)求的 (1-a%)*(1-b%)……*(1-%n)的最大值 即可。
             (3)現在 使 a 代替 1-a%,b 代替 1-b%……;即求 a*b*c*……*n的最大值!(注意::0<a<1……);
             (4)現在以e為底  取對數log a*b……*n 即log a +( log b)……+(log n) 有函數性質可知,log a 為 負值……log n 為負值。
              (5)求 【log a】+ log【b】+…………+【logn】 的最小值 即可(【】代表絕對值)這就成了 最短路了!!
AC代碼:
[cpp]
#include<stdio.h> 
#include<string.h> 
#include<math.h> 
#include<queue> 
#include<vector> 
using namespace std; 
int s,t,Max,ac[50005]; 
double d[50005]; 
struct node 

    int x; 
    double y; 
}; 
vector<node> V[50005]; 
void spfa(int n) 

    int a,b,i,j; 
    for(a=1;a<=n;a++) 
    { 
        ac[a]=0; 
        d[a]=999999999; 
    } 
    d[s]=0; 
    queue<int> Q; 
    Q.push(s); 
    ac[s]=1; 
    while(!Q.empty()) 
    { 
        i= Q.front(); 
        //printf("i----%d\n",i); 
        Q.pop(); 
        ac[i]=0; 
        for(a=0;a<V[i].size();a++) 
        { 
            j=V[i][a].x; 
            if(d[j]>d[i]+V[i][a].y) 
            { 
                d[j]=d[i]+V[i][a].y; 
                if(ac[j]==0) 
                { 
                    Q.push(j); 
                    ac[j]=1; 
                } 
            } 
        } 
    } 
    if(d[t]<999999999) 
    { 
        printf("%.2lf\n",(1-exp(-d[t]))*Max); 
    } 
    else 
        printf("IMPOSSIBLE!\n"); 
    for(a=1;a<=n;a++) 
        V[a].clear(); 
} www.2cto.com
int main() 

    int a,b,n,m,i,j; 
    while(~scanf("%d",&n)) 
    { 
        for(a=1;a<=n;a++) 
        { 
            scanf("%d",&m); 
            while(m--) 
            { 
                scanf("%d%d",&i,&j); 
                double k; 
                k=-log(1-double(j)/100); 
                node t1={i,k}; 
                V[a].push_back(t1); 
            } 
        } 
        scanf("%d%d%d",&s,&t,&Max); 
        spfa(n); 
    } 


 

作者:PIAOYI0208

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved