考試的時候靈光一閃,瞬間推出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 #include2noip2017 逛公園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 洛谷 逛公園
初見安 這個本狸咕了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 首先考慮第一檔 顯然就是乙個最短路徑計數,是乙個非常經典的問題,...