求助 P4017 全WA 样例对√,思路没问题,请大佬们指点指点!
查看原帖
求助 P4017 全WA 样例对√,思路没问题,请大佬们指点指点!
547893
liangjinkai01楼主2022/12/24 11:05

# 代码如下:

//拓扑排序,模板 
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
int n,m,head[N],in[N],out[N],topo[N],dp[N],cnt,cnt1;
struct edge{
	int to,next;//前驱与后继 
	//因为这是一个有向无权图,所以不需要变量w 
}e[500010];
//建边函数 
void add(int a,int b){
	e[cnt].to=b;
	e[cnt].next=head[a];
	head[a]=cnt++;
}
//拓扑排序 
bool TopoSort(){
	stack<int> s;//创建s栈
	//查找当前是否有入度为0的节点 
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			s.push(i);//入栈 
		} 
	} 
	while(!s.empty()){
		int t=s.top();//用t存储栈顶元素
		s.pop(); //栈顶元素出栈
		topo[cnt1++]=t;//进入topo数组(保存排序结果的数组)
		//判断该点的邻接点入度-1后是否等于0 
		for(int i=head[t];i!=-1;i=e[i].next){
			if(--in[e[i].to]==0){
				dp[e[i].to]+=dp[t];
			//cout<<dp[e[i].to]<<" "<<dp[t]<<" "<<i<<e[i].to<<endl;
				s.push(e[i].to);//入栈
			}
		} 
	}
	if(cnt1<n) return false;
	else return true;
}
int main(){
	int a,b,i;
	cin>>n>>m;
	//初始化 
	memset(head,-1,sizeof(head));
	for(i=1;i<=n;i++){
		dp[i]=1;
	}
	//建边 
	for(i=1;i<=m;i++){
		cin>>a>>b;
		add(a,b);
		//求入度 
		in[b]++;//将b点入度加一 
		out[a]++;
	}
	TopoSort();
	int ans=0;
    for(i=1;i<=n;i++){
    	if(out[i]==0){
    		ans=ans+dp[i];
    		ans=ans%80112002;
    		//cout<<i<<" "<<dp[i]<<" "<<ans<<endl; 
		}
	}
	cout<<ans;	
	return 0;
}

思路如下:

思路 请大佬们看一下,给我这个小白一些帮助。 谢谢!!!

2022/12/24 11:05
加载中...