这是今年天梯赛的一道题,当时L2的题一道都没过,这道L3的题自然也没看。赛后看了看,感觉蛮有意思,试着做了做。起初想到的思路是:DFS整个有向图,每次遍历到一个点都对该点所经路径+1,可这个题的N蛮大的,果然最后一个点超时,还有一个点答案错误(超时的测试点在我意料之内,本就写了个死笨的解法)。想了想第5个测试点测试的原因,又画了画一些特殊路径,果然找到了bug,从起点推到终点后不能再继续往起点下面推了,也就是把所有终点能到达的点(边)全部砍掉,也就是到达终点就不能往下走了,要把终点看成是一个汇点。解决这个bug后,28分,最后一个测试点卡算法优化。学长给了一种思路,解决了这个问题:用拓扑排序的思想,dp到达每个点的路径条数,挺好。这里借花献佛,上代码:
#include<bits/stdc++.h>
using namespace std;
vector<int> v[555];
vector<pair<int, int>> v2;
int vis[555];
int in[555];
int dp[555];
int n, m, s, e;
void DFS(int next) {
if (next == e)
return;
vis[next] = 1;
for (int i : v[next]) {
if (!vis[i])
DFS(i);
}
}
signed main() {
//freopen("in","r",stdin);
cin >> n