CSP模擬賽 益智遊戲(最短路 拓撲排序)

2021-09-28 13:35:23 字數 1845 閱讀 7483

題目描述

小p和小r在玩一款益智遊戲。遊戲在乙個正權有向圖上進行。 小p 控制的角色要從a 點走最短路到b 點,小r 控制的角色要從c 點走最短路到d 點。 乙個玩家每回合可以有兩種選擇,移動到乙個相鄰節點或者休息一回合。 假如在某一時刻,小p 和小r 在相同的節點上,那麼可以得到一次特殊獎勵,但是在每 個節點上最多只能得到一次。 求最多能獲得多少次特殊獎勵

輸入格式

第一行兩個整數n,m 表示有向圖的點數和邊數。 接下來m 行每行三個整數xi,yi,li,表示從xi 到yi 有一條長度為li 的邊。 最後一行四個整數a,b,c,d,描述小p 的起終點,小r 的起終點。

輸出格式

輸出乙個整數表示最多能獲得多少次特殊獎勵。若小p不能到達b點或者小r不能到達d點則輸出-1。

輸入樣例

5 51 2 1

2 3 2

3 4 4

5 2 3

5 3 5

1 3 5 4

輸出樣例2提示

對於30%的資料,滿足n≤50 對於60%的資料,滿足n≤1000,m≤5000 對於100%的資料,滿足n≤50000,m≤200000,1≤li≤500000000

分析a到b,c到d的最短路有很多條。

但對於任意一條a到b的最短路和任意一條c到d的最短路如果他們有交點,那交點一定是連續的,否則一定存在交點更多的兩條最短路。

所以最優方案中特殊獎勵的點一定是連續的。

於是我們可以用同時在a-b最短路上和c-d最短路上的有向邊構成乙個新圖

那麼新圖一定是乙個有向無環圖,但不一定聯通

最後對新圖拓撲排序dp最長鏈即可

#include

#include

#include

#include

using

namespace std;

const

int maxn=

50005

;const

int maxm=

200005

;struct node

;bool

operator

<

(node a,node b)

int info[maxn]

,nx[maxm<<1]

,v[maxm<<1]

,w[maxm<<1]

,re[maxm<<1]

;long

long d[5]

[maxn]

;int n,m,en,ans,ecnt,p[5]

,dp[maxn]

,vis[maxn]

,inp[maxn]

,top[maxn]

,lef[maxm<<1]

;priority_queueq;

void

add(

int u1,

int v1,

int w1,

int r)

void

spfa

(int k));

while

(!q.

empty()

));}

}int

main()

for(

int x=

1;x<=n;x++

)for

(int x=

1;x<=n;x++)if

(inp[x]==0

)top[

++en]

=x,dp[x]=1

;for

(int i=

1;i<=en;i++)}

printf

("%d\n"

,ans)

;}

CSP模擬賽 方程(數學)

題目描述 求關於x的方程 x1 x2 xk n的非負整數解的個數。輸入格式 僅一行,包含兩個正整數n,k。輸出格式 乙個整數,表示方程不同解的個數,這個數可能很大,你只需輸出mod 20080814 的結果。輸入樣例 1 1輸出樣例1提示 資料範圍 對於50 的資料,n,k 300 對於80 的資料...

CSP模擬賽 方程(數學)

求關於x的方程 x1 x2 xk n的非負整數解的個數。僅一行,包含兩個正整數n,k。乙個整數,表示方程不同解的個數,這個數可能很大,你只需輸出mod 20080814 的結果。1 11 提示資料範圍 對於50 的資料,n,k 300 對於80 的資料,n,k 1000 對於100 的資料,n,k ...

CSP模擬賽 巨神兵

題目 歐貝利斯克的巨神兵很喜歡有向圖,有一天他找到了一張 n 個點 m 條邊的有向圖。歐貝利斯克認為乙個沒有環的有向圖是優美的,請問這張圖有多少個子圖 即選定乙個邊集 是優美的?答案對 10 9 7 取模。對於40 的資料 n 5,m 20 對於60 的資料 n 10 對於80 的資料 n 15 對...