先拓扑排序,然后计算,哪里错了呢?
查看原帖
先拓扑排序,然后计算,哪里错了呢?
413517
Ewin楼主2021/7/24 17:20
#include<bits/stdc++.h>
#define MAXN 20100
using namespace std;
int n,m,cnt;
bool a[MAXN][MAXN];
int ind[MAXN],ans[MAXN];
int js[MAXN];
bool book[MAXN];
bool book2[MAXN];
queue<int> q;
void input(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        a[x][y]=1;
        ind[y]++;
        book[x]=1;
        book2[y]=1;
    }
}
void toposort(){
    for(int i=1;i<=n;i++){
        if(ind[i]==0){
            q.push(i);
        }
        while(!q.empty()){
            int u=q.front();
            ans[++cnt]=u;
            q.pop();
            for(int i=1;i<=n;i++){
                if(a[u][i]){
                    ind[i]--;
                    if(ind[i]==0){
                        q.push(i);
                    }
                }
            }
        }
    }
}
int main(){
    input();
    toposort();
    for(int i=1;i<=n;i++){
        if(!book[i]){
            js[i]=1;
        }
    }//cout<<"cnm";
    for(int i=cnt;i>1;i--){
        for(int j=1;j<i;j++){
            if(a[ans[j]][ans[i]]){
                js[ans[j]]+=js[ans[i]]%80112002;
                js[ans[j]]%=80112002;
            }
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++){
        if(!book2[i]){
            sum+=js[i]%80112002;
            sum%=80112002;
        }
    }
    cout<<sum%80112002;
    return 0;
}
2021/7/24 17:20
加载中...