題目描述
小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 對...