wnjxyk和dididi正在玩遊戲。 dididi在紙上繪製乙個有向圖g,該圖包含n個點,m個有向邊且無迴圈。 wnjxyk從點1開始。每回合,wnjxyk將隨機選擇從當前點開始的有向邊之一,其可能性均等,然後從該邊轉到下乙個點。遊戲將繼續,直到沒有這種優勢為止。 dididi將把寶藏放在點n上,如果wnjxyk經過這一點,他就可以得到寶藏。 wnjxyk有機會刪除一條邊(他也不能選擇刪除),這樣他可以增加獲得寶藏的可能性。您的任務是計算wnjxyk在最佳條件下獲得寶藏的可能性。
輸入輸入的第一行包含乙個正整數t,告訴您緊隨其後的t個測試用例。
對於每個測試用例,第一行包含兩個整數n,m,分別指示點數,邊數。
然後,以下是m行,每行包含兩個整數x和y,表示存在從x到y的邊。
保證不存在多個邊緣。
輸出對於每個測試用例,列印一行「 case #x:y」,其中x是案例編號(從1開始),y是他得到寶藏的概率。 (四捨五入到小數點後六位)。
樣例輸入
24 41 2
1 31 4
2 34 5
1 21 3
1 42 3
2 4
樣例輸出 copy
case #1: 0.500000case #2: 0.750000
提示tips:1≤t≤100,3≤n≤50,1≤m≤n(n-1)/2
case 1: delete 1 - 2, 50% 1->3, 50% 1->4.
case 2: delete 1 - 3, 25% 1->2->4, 25% 1->2->3, 50% 1->4.
反向建圖,列舉刪除每一條邊。
圖中不存在環,因此到達每乙個點的值都是由其父節點等概率分配來的,於是我們可以統計每個點有多少個孩子,然後進行記憶化搜尋。
#pragma gcc optimize(1)#pragma gcc optimize(2)
#pragma gcc optimize(3,"ofast","inline")#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;template
void read(tp &x)
if(ch=='-'
)else fh=1
;
while(ch>='
0'&&ch<='9'
) x*=fh;
}inline
char read1()//
字串讀入掛
const
int maxn=200
;const
int mod=1000000007
;const
int inf=0x3f3f3f
;struct
nodeedge[maxn*maxn];
intn,m;
intdx,dy,tot;
double
v[maxn],ans;
int head[maxn],out
[maxn];
intvis[maxn][maxn];
void add(int u,int
v)double dfs(int
x)
else
for(int i=head[x];~i;i=edge[i].next)
ans1+=dfs(to)/out
[to];}}
v[x]=ans1;
return
ans1;
}void
inint()
intmain()
for(int i=1;i<=n;i++) }}
memset(v,
0.0,sizeof
(v));
dx=dy=-1;//
不刪邊
ans=max(ans,dfs(n));
printf(
"case #%d: %.6lf\n
",case,ans);
}return0;
}
瑪麗卡(spfa刪邊求最短路)
題目描述 麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無...
最短路徑樹 刪邊
題意 n nn 個點,m mm條邊的無向圖,令dis disdi s為每對結點的最短路長度的和。例如n 2 n 2n 2時,dis d 1 1 d 1,2 d 2,1 d 2,2 dis d 1,1 d 1,2 d 2,1 d 2,2 dis d 1,1 d 1 2 d 2,1 d 2,2 現在要求...
GDOI2003 刪邊 騎士問題
刪邊刪邊 刪邊description 連通圖是指任意兩個頂點都有路徑可互相到達的圖。讀入乙個無向的連通圖,輸出最多能刪掉多少條邊,使這個圖仍然連通。input 第一行為圖的頂點數n 1 n 100 和邊數m,用乙個空格隔開,圖中的頂點用1到n的整數 編號。接下來的m行,每行用兩個數v1,v2表示一條...