20PTS求调(只A了1,2)
查看原帖
20PTS求调(只A了1,2)
1804375
Zh_yh楼主2025/8/29 16:18
#include<bits/stdc++.h>
#define Divisior 80112002 
using namespace std;
vector<vector<int> > graph(500001);//邻接表 
int Indegree[500001],Outdegree[500001];//存储入度和出度 
vector<int> If0ut;//存储出度为0的点 
int NumVertex,NumEdge,FoodChain=0;
inline vector<int> TopologicalSort(){//拓扑排序函数 
	queue<int> Searching;
	vector<int> ReSuLt,Temp_Indegree(NumVertex+1);
	If0ut.reserve(500001);
	for (int i=1;i<=NumVertex;i++){
		Temp_Indegree[i]=Indegree[i];//复制原数组 
		if(Outdegree[i]==0){If0ut.push_back(i);}
		if(Indegree[i]==0){Searching.push(i);}
		//找入度为0的点
	}
	while(!Searching.empty()){
		int Current=Searching.front();Searching.pop();
		ReSuLt.push_back(Current);
		for (int i=0;i<graph[Current].size();i++){
			int Next=graph[Current][i]; 
			Temp_Indegree[Next]--;
			if(Temp_Indegree[Next]==0) Searching.push(Next);
		}
	}
	return ReSuLt;
}
int main(){
	cin>>NumVertex>>NumEdge;
	for (int i=1;i<=NumEdge;i++){
		int vertex,destination;
		cin>>vertex>>destination;
		graph[vertex].push_back(destination);
		Indegree[destination]++;
		Outdegree[vertex]++;
	}
	vector<int> TopologicalVector=TopologicalSort();
	vector<int> TotDp(NumVertex+1,0);
    for (int i=1;i<=NumVertex;i++){
        if(Indegree[i]==0) TotDp[i]=1; //初始化所有起点
    }
    for (int i=0;i<TopologicalVector.size();i++){//DP
        int vert=TopologicalVector[i];
        for (int j=0;j<graph[vert].size();j++){
            int Desti=graph[vert][j];
            TotDp[Desti]+=TotDp[vert];
        }
    }
	for (int i=0;i<If0ut.size();i++){
	    if (Indegree[If0ut[i]]!=0||Outdegree[If0ut[i]]!=0){
	        FoodChain+=TotDp[If0ut[i]];//输出路径数并排除孤立结点
	    	FoodChain%=Divisior;
		}
	}
	cout<<FoodChain%Divisior;
	return 0;
}
2025/8/29 16:18
加载中...