資料的第1行為兩個整數n和e,以空格分隔,分別表示森林中的景點數和連線相鄰景點的路的條數。 第2行包含兩個整數c和m,以空格分隔,分別表示初始時聰聰和可可所在的景點的編號。 接下來e行,每行兩個整數,第i+2行的兩個整數ai和bi表示景點ai和景點bi之間有一條路。 所有的路都是無向的,即:如果能從a走到b,就可以從b走到a。 輸入保證任何兩個景點之間不會有多於一條路直接相連,且聰聰和可可之間必有路直接或間接的相連。
輸出1個實數,四捨五入保留三位小數,表示平均多少個時間單位後聰聰會把可可吃掉。
【輸入樣例1】
4 31 4
1 22 3
3 4【輸入樣例2】
9 99 3
1 22 3
3 44 5
3 64 6
4 77 8
8 9【輸出樣例1】
1.500
【輸出樣例2】
2.167
【樣例說明1】
開始時,聰聰和可可分別在景點1和景點4。
第乙個時刻,聰聰先走,她向更靠近可可(景點4)的景點走動,走到景點2,然後走到景點3;假定忽略走路所花時間。
可可後走,有兩種可能:
第一種是走到景點3,這樣聰聰和可可到達同乙個景點,可可被吃掉,步數為1,概率為 。
第二種是停在景點4,不被吃掉。概率為 。
到第二個時刻,聰聰向更靠近可可(景點4)的景點走動,只需要走一步即和可可在同一景點。因此這種情況下聰聰會在兩步吃掉可可。
所以平均的步數是1* +2* =1.5步。
對於所有的資料,1≤n,e≤1000。
對於50%的資料,1≤n≤50。
很好的一道期望題
考慮列舉聰聰和可可的位置 通過跑最短路得出聰聰在i,可可在j時聰聰下一步的走法
然後跑記憶化搜尋 列舉可可到達的位置
dp[x][y]=∑dp[s[s[x][y]][y]][i](y能到達i)/(degree[y]+1)+dp[s[s[x][y]][y]][y]/(degree[y]+1)
注意處理邊界條件 感覺題目沒說清楚 應該是多少個單位時間
#includeusing namespace std;
const int maxn=1010;
struct edge
e[maxn<<1];
int cnt,head[maxn];
inline void addedge(int x,int y)
int n,m,s,t;
int s[maxn][maxn],dis[maxn][maxn];
long double dp[maxn][maxn];
bool vis[maxn];
inline void spfa(int x)}}
}} int degree[maxn];
long double solve(int x,int y)
int main()
for(int i=1;i<=n;i++)
spfa(i);
/*for(int i=1;i<=n;i++)
*/printf("%.3lf",(double)solve(s,t));
}
BZOJ1415 Noi2005 聰聰和可可
portal 一張無向連通圖,貓和老鼠起始點分別位於a,b。每一步貓先行,老鼠每一步可以走連向當前點的任意一條邊,也可以不動,概率相同。貓每一步走向離老鼠最近的點,若該點有多個,選擇標號最小的乙個,若一步沒有到老鼠所在點,還可以再走一步。求貓捉到老鼠的期望步數。首先可以先預處理出陣列p x y 表示...
bzoj1415 Noi2005 聰聰和可可
傳送門 記憶化搜尋。用f i j 表示兩個人物在i和j時的期望值。然後列舉各種情況 1.重合 答案為0 2.差兩步之內 答案為1 3.差2步以上 走兩步後的f值 1 取乙個平均值就可以了。include include include include include include using na...
bzoj1415 noi2005 聰聰和可可 期望
本來毫無思路,看到網上設了二維陣列表示期望後,覺得很妙。設f i j 為聰聰在i,可可在j的聰聰吃到可可的時間期望。dis i j 1 2 時,f i j 1 i j 時,f i j 0 由於聰聰能走2步,可可每次只能走一步,所以dis i j 一定是越來越小的。我們可以先處理出g i j 表示此時...