比賽 NOIP2017 逛公園

2022-05-27 06:21:12 字數 2219 閱讀 3562

考試的時候靈光一閃,瞬間推出dp方程,但是不知道怎麼判-1,然後?然後就炸了。

後來發現,我只要把拓撲和dp分開,中間加乙個判斷,就ac了,可惜。

看這道題,我們首先來想有哪些情況是-1:只要有零環在滿足題目要求的路徑上,那麼這條路徑就可以不停地走,於是就-1了。

如何判有沒有零環呢?

機械化地兩遍不同方向的spfa,就知道某個點在不在最短路上,以此建乙個最短路圖,在最短路圖上找零環。於是就拓撲啦。稍加判斷就解決了整個題目最關鍵的-1。

接下來就是dp了,設f[i][j]表示走到i點,走過路程已經超過i點到n點最短路徑長度j的方案數。假設我們知道u點的f[u][k],接下來我們會走到v。那麼如果走的這條邊正好是最短路上的邊,f[v][k]+=f[u][k];否則,我們根據f[u][k]知道現在已走路程為dis[u]+k,走完這條邊後,就是dis[u]+k+w[i],這些路程會超過v到n的最短路長度dis[u]+k+w[i]-dis[v]這麼長,所以,f[v][dis[u]+k+w[i]-dis[v]]+=[u][k]。

大體就是這樣,剩下一些小細節就看**吧。

1 #include2

using

namespace

std;

3const

int maxn=100000+10,maxm=200000+10,maxk=60+10,inf=0x3f3f3f3f;4

intn,m,mod,k,e,qe,beg[maxn],qbeg[maxn],dis1[maxn],p[maxn],dis2[maxn],nex[maxm],qnex[maxm],w[maxm],qw[maxm],to[maxm],qto[maxm],indegree[maxn],f[maxn][maxk],cnt,topoorder[maxn];

5 inline void read(int &x)

614 inline void chksum(int &a,int

b)15

19 inline void insert(int x,int y,int

z)20

30 inline void

init()

3140 inline void

spfa()

4161}62

}63for(register int i=1;i<=n;++i)dis2[i]=inf,p[i]=0;64

q.push(n);

65 p[n]=1

;66 dis2[n]=0;67

while(!q.empty())

6881}82

}83}84 inline void

toposort()

85102

}103

}104 inline void

dp()

105115

for(register int x=1;x<=n;++x)

116for(register int i=beg[x];i;i=nex[i])

117if(dis1[to[i]]!=dis1[x]+w[i]&&j+dis1[x]+w[i]-dis1[to[i]]<=k)chksum(f[to[i]][j+dis1[x]+w[i]-dis1[to[i]]],f[x][j]);

118}

119}

120int

main()

121137

spfa();

138toposort();

139for(register int i=1;i<=n;++i)

140if(indegree[i]&&dis1[i]+dis2[i]<=dis1[n]+k)

141146

if(mark)continue

;147

dp();

148int ans=0

;149

for(register int i=0;i<=k;++i)chksum(ans,f[n][i]);

150 printf("

%d\n

",ans);

151}

152return0;

153 }

noip2017 逛公園

NOIP2017 洛谷 逛公園

初見安 這個本狸咕了4個月的題終於寫出來了qaq!這裡是傳送門 洛谷p3953 逛公園 策策每天都會去逛公園,他總是從1號點進去,從nn號點出來。策策喜歡新鮮的事物,它不希望有兩天逛公園的路線完全一樣,同時策策還是乙個 特別熱愛學習的好孩子,它不希望每天在逛公園這件事上花費太多的時間。如果1號點 到...

NOIp2017 逛公園 dp 記搜

給定乙個有向圖,起點為 1 終點為 n 求和最短路相差不超過 k 的路徑數量.有 0 邊.如果有無數條,則輸出 1 n leq 10 5,k leq 50 首先,有無數條邊的情況一定是在與最短路相差不超過 k 的一條路上有 0 環.先不考慮 0 邊和 0 環,get 70pts 做法 先跑乙個最短路...

NOIP 2017 逛公園 最短路 dp

題意 求出 從 1 到 n 的路徑長度小於等於最短路 k 的路徑個數 分析 首先觀察資料特點 30 的資料 k 0 且沒有 0 邊,等同於最短路計數 70 的資料沒有 0 邊,那麼就是相當於沒有 0 環 100 的資料 k le 50 首先考慮第一檔 顯然就是乙個最短路徑計數,是乙個非常經典的問題,...