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<=100000,M<=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.绿豆蛙的归宿(拓扑排序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MapReduce自定义二次排序流程
- 下一篇: 生成 PDF 全攻略【1】初体验