Noi2005 聰聰和可可

2021-06-22 07:28:34 字數 2784 閱讀 1410

[noi2005]聰聰和可可

time limit:10000ms  memory limit:65536k

total submit:21 accepted:14

description

input

資料的第1行為兩個整數n和e,以空格分隔,分別表示森林中的景點數和連線相鄰景點的路的條數。 第2行包含兩個整數c和m,以空格分隔,分別表示初始時聰聰和可可所在的景點的編號。 接下來e行,每行兩個整數,第i+2行的兩個整數ai和bi表示景點ai和景點bi之間有一條路。 所有的路都是無向的,即:如果能從a走到b,就可以從b走到a。 輸入保證任何兩個景點之間不會有多於一條路直接相連,且聰聰和可可之間必有路直接或間接的相連。

output

輸出1個實數,四捨五入保留三位小數,表示平均多少個時間單位後聰聰會把可可吃掉。

sample input

【輸入樣例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

sample output

【輸出樣例1】

1.500

【輸出樣例2】

2.167

hint

【樣例說明1】 

開始時,聰聰和可可分別在景點1和景點4。 

第乙個時刻,聰聰先走,她向更靠近可可(景點4)的景點走動,走到景點2,然後走到景點3;假定忽略走路所花時間。 

可可後走,有兩種可能: 

第一種是走到景點3,這樣聰聰和可可到達同乙個景點,可可被吃掉,步數為1,概率為 。 

第二種是停在景點4,不被吃掉。概率為 。 

到第二個時刻,聰聰向更靠近可可(景點4)的景點走動,只需要走一步即和可可在同一景點。因此這種情況下聰聰會在兩步吃掉可可。 

所以平均的步數是1* +2* =1.5步。 

對於所有的資料,1≤n,e≤1000。 

對於50%的資料,1≤n≤50。

source

noi 2005

聰聰和可可

用n次spfa求出當聰聰在i位置,可可在j位置時,聰聰走的第一步。

同f[i][j]表示聰聰在i位置,可可在j位置時聰聰吃到可可的期望步數。

當聰聰在i位置,可可在j位置時,聰聰所走的路線是確定的(走距離可可最近的點(如果有多個走標號最小的))。而可可有deg[j] + 1個選擇(deg[j]表示j點的度),很明顯,聰聰能否吃到可可,與可可選擇的路線有關係(如果聰聰的下1步就是可可所在的位置或者聰聰下2步就是可可所在的位置聰聰只需要一次選擇就能吃到可可(聰聰先走))

如果聰聰與可可在同乙個位置,聰聰已經吃到可可了,期望為0.

那麼:f[i][j] = 

1.i == j , 0;

2.path[i][j] == j || path[path[i][j]][j] == j , 1;

3.如果聰聰不能在一次選擇中吃到可可,那麼她吃到可可的期望就與可可所做的選擇有關了

f[i][j] = (f[path[path[i][j]]][j](可可還停留在在j位置) + ∑(f[path[path[i][j]][j]][v])(v表示與j相鄰的點) ) / (deg[j] + 1) + 1;(每個選擇的概率1 / (deg[j] + 1))

記憶化搜尋實現:

#include #include #include #include #include #include #include using namespace std;

const int maxn = 1000 + 10;

const double eps = 1e-8;

const int inf = 1000000000;

double f[maxn][maxn];

int path[maxn][maxn];

int deg[maxn];

int dis[maxn];

bool vis[maxn];

int n, m, st, en;

struct node

edge[maxn * maxn];

int head[maxn], e;

void add(int u, int v)

void init()

}}double dfs(int x, int y)

double sum = dfs(path[path[x][y]][y], y);

for (int i = head[y]; i != -1; i = edge[i].next)

return f[x][y] = sum / (deg[y] + 1.0) + 1.0;

}queue q;

void spfa(int u)

dis[u] = 0;

vis[u] = true;

q.push(u);

while (!q.empty())

else if (dis[v] == dis[cur] + 1)}}

}void input()

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

printf("%.3lf\n", dfs(st, en));

}}int main()

 題目鏈結

NOI2005 聰聰與可可

輸入檔案 cchkk.in輸出檔案 cchkk.out簡單對比 時間限制 1 s 記憶體限制 256 mb 問題描述 在乙個魔法森林裡,住著乙隻聰明的小貓聰聰和乙隻可愛的小老鼠可可。雖然灰姑娘非常喜歡她們倆,但是,聰聰終究是乙隻貓,而可可終究是乙隻老鼠,同樣不變的是,聰聰成天想著要吃掉可可。一天,聰...

NOI 2005 聰聰與可可

一張 n 個點,m 條邊的有向圖中,貓在 a 點,鼠在 b 點,每一秒兩者按照以下規則移動 當任意時刻貓到達鼠所在地時鼠被吃掉,求鼠被吃掉的期望時間。bzoj200題達成紀念 include include include include include include include includ...

NOI 2005 聰聰和可可(DP)

題目大意 給你個無向圖,貓在乙個點,老鼠在乙個點,貓一次走兩步,老鼠一次可以一步,也可以不走。貓每次會選擇離老鼠最近的並且編號最小的點走。老鼠有1 p 1 的概率停留在原地或走向相鄰的乙個點 p為當前點的度 求貓追老鼠的步數的數學期望。題目分析 真是個悲劇的題啊 最開始就想這個題沒法做啊 怎麼搞啊,...