日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

31.绿豆蛙的归宿(拓扑排序)

發布時間:2025/4/9 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 31.绿豆蛙的归宿(拓扑排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?時間限制: 1 s

?空間限制: 64000 KB

?題目等級 : 黃金 Gold

題解

題目描述?Description

  隨著新版百度空間的上線,Blog寵物綠豆蛙完成了它的使命,去尋找它新的歸宿。

  給出一個有向無環圖,起點為1終點為N,每條邊都有一個長度,并且從起點出發能夠到達所有的點,所有的點也都能夠到達終點。綠豆蛙從起點出發,走向終點。
  到達每一個頂點時,如果有K條離開該點的道路,綠豆蛙可以選擇任意一條道路離開該點,并且走向每條路的概率為?1/K?。
  現在綠豆蛙想知道,從起點走到終點的所經過的路徑總長度期望是多少?

輸入描述?Input Description

  第一行:?兩個整數?N?M,代表圖中有N個點、M條邊
  第二行到第?1+M?行:?每行3個整數?a?b?c,代表從a到b有一條長度為c的有向邊

輸出描述?Output Description

  從起點到終點路徑總長度的期望值,四舍五入保留兩位小數。

樣例輸入?Sample Input

4 4
1 2 1
1 3 2
2 3 3
3 4 4

樣例輸出?Sample Output

7.00

數據范圍及提示?Data Size & Hint

  對于20%的數據???N<=100
  對于40%的數據???N<=1000
  對于60%的數據???N<=10000
  對于100%的數據??N<=100000M<=2*N

代碼:

(當輸入數據數量接近邊界最大值時,會超時,要開很大的數組時,最好用動態數組解決,節省時間)

#include

using namespace std;

#include

#include

#define maxn 100001

int rudu[maxn],chudu[maxn],ans[maxn],a,b,c;

struct Edge{

?????? int u,v,w,next;

};

Edge edge[2*maxn];

int head[maxn]={0},n,m;

double sumhope=0,rate[maxn];

void input();

void topsort();

int main()

{

?????? input();

?????? topsort();

?????? printf("%.2lf",sumhope);

?????? return 0;

}

void topsort()

{

?????? int tot=0;

?????? int t;

?????? t=0;

?????? for(int i=1;i<=n;++i)

??? if(!rudu[i])

?? ? {

?? ???????? t++;

????????????? tot++;

????????????? rudu[i]=99999;

????????????? rate[i]=1;

????????????? ans[t]=i;

?????? ?? }

?????? while(tot

?????? {

????????????? for(int i=1;i<=t;++i)

????????????? ? for(int j=head[ans[i]];j!=0;j=edge[j].next)

????????????? ? {

????????????? ? ??? rudu[edge[j].v]--;

????????????? ? ??? rate[edge[j].v]+=rate[ans[i]]/chudu[ans[i]];

????????????? ? ??? sumhope+=(rate[ans[i]]/chudu[ans[i]])*edge[j].w;

????????????? ? }

????????????? t=0;

????????????? for(int i=1;i<=n;++i)

???????????????????? if(!rudu[i])

?????? ????????????? {

??????????????????????????? rudu[i]=99999;

??????????????????????????? t++;

??????????????????????????? tot++;

??????????????????????????? ans[t]=i;

???????????????????? }

?????????????

??????

?????? }

}

void input()

{

?????? scanf("%d%d",&n,&m);

?????? for(int i=1;i<=m;++i)

?????? {

????????????? scanf("%d%d%d",&a,&b,&c);

????????????? edge[i].u=a;

????????????? edge[i].v=b;

????????????? edge[i].w=c;

????????????? rudu[b]++;

????????????? chudu[a]++;

????????????? edge[i].next=head[a];

????????????? head[a]=i;

?????? }

}

轉載于:https://www.cnblogs.com/csgc0131123/p/5290473.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的31.绿豆蛙的归宿(拓扑排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。