大佬们,我的思路是每个点的路数等于这个点的入度加上它前面的每个点的路数 - 1,然后从用前向星存图,从入度为0的点开始遍历,每个点都能入队一次做为一个head的存在,读取每个head点的时候就把它相关每个到的点dp一次(有点乱)大概是这么个思路,样例能过但是一道都ac不了,想知道问题在哪,谢谢 代码:
#include<iostream>
#include<bits/stdc++.h>
#include<stdlib.h>
using namespace std;
const int mod = 80112002;
int head[5010], in[5010] = { 0 }, out[5010] = { 0 }, p = 1, book[5010], dp[5010];
struct node
{
int to, nxt;
}edge[500010];
int main()
{
int n, m, x, y, hd = 1, tail = 1, que[5010], cnt = 0;
cin >> n >> m;
memset(head, -1, sizeof(head));
memset(book, -1, sizeof(book));
memset(que, 0, sizeof(que));
for (int i = 1; i <= m; i++)
{
cin >> x >> y;
edge[i].to = y;
in[y]++;
dp[y]++;
out[x]++;
edge[i].nxt = head[x];
head[x] = i;
}
while (p <= n)
{
while (1)
{
if (in[p] == 0)break;
p++;
}
if (p > n) break;
if (in[p] == 0)
{
que[tail] = p;
book[p] = 1;
tail++;
p++;
}
//cout << p << endl;
while (hd < tail && hd <= n)
{
//cout << que[hd] << endl;
for (int i = head[que[hd]]; i != -1; i = edge[i].nxt)
{
//if (book[que[hd]] == 1) break;
//cout << "book[" << edge[i].to << "]=" << book[edge[i].to] << endl;
if (book[edge[i].to] == -1)
{
//cout << edge[i].to << "入队" << endl;
que[tail] = edge[i].to;
tail++;
book[edge[i].to] = 1;
}
if (dp[que[hd]] != 0)
dp[edge[i].to] += dp[que[hd]] - 1;
else
dp[edge[i].to] += dp[que[hd]];
}
hd++;
}
}
for (int i = 1; i <= n; i++)
if (out[i] == 0) cnt += dp[i];
cout << cnt;
}