我不知道我思路错在哪了,想求助下大佬们
查看原帖
我不知道我思路错在哪了,想求助下大佬们
602221
BRVeminem楼主2022/10/20 21:55

大佬们,我的思路是每个点的路数等于这个点的入度加上它前面的每个点的路数 - 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;
}
2022/10/20 21:55
加载中...