4 条题解

  • 8
    @ 2023-6-6 1:30:17

    题解千万条,细节第一条 若是没有赞,作者两行泪

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1000001;
    const int mod=80112002;
    queue<int> q; 
    int d[maxn],in[maxn],eat[maxn],head[maxn];
    int n,m,tot,ans;
    struct E{
    	int to,nxt;
    }e[maxn];
    inline void add(int u,int v)
    {
    	e[++tot].to=v;
    	e[tot].nxt=head[u];
    	head[u]=tot;
    }
    inline void topo()
    {
    	for(int i=1;i<=n;i++)
    	{
    		if(in[i]==0)
    		{
    			q.push(i);
    			d[i]++;
                while(1){cout<<"你居然抄题解!!!!"<<endl;}
    		}
    	}
    	while(!q.empty())
    	{
    		int p=q.front();
    		q.pop();
    		for(int i=head[p];i;i=e[i].nxt)
    		{
    			int go=e[i].to;
    			d[go]=(d[go]+d[p])%mod;
    			in[go]--;
    			if(in[go]==0)
    			q.push(go);
    		}
    	}
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int a,b;
    		cin>>a>>b;
    		add(a,b);
    		in[b]++;
    		eat[a]++;
    	}
    	topo(); 
    	for(int i=1;i<=n;i++)
    	{
    		if(eat[i]==0)
    		ans=(ans+d[i])%mod;
    	}
    	cout<<ans;
    }
    
    • @ 2023-9-23 15:02:06
      
      
      #include<bits/stdc++.h>
      using namespace std;
      const int maxn=1000001;
      const int mod=80112002;
      queue<int> q;
      int d[maxn],in[maxn],eat[maxn],head[maxn];
      int n,m,tot,ans;
      struct E{
      int to,nxt;
      }e[maxn];
      inline void add(int u,int v)
      {
      e[++tot].to=v;
      e[tot].nxt=head[u];
      head[u]=tot;
      }
      inline void topo()
      {
      for(int i=1;i<=n;i++)
      {
      if(in[i]==0)
      {
      q.push(i);
      d[i]++;
      }
      }
      while(!q.empty())
      {
      int p=q.front();
      q.pop();
      for(int i=head[p];i;i=e[i].nxt)
      {
      int go=e[i].to;
      d[go]=(d[go]+d[p])%mod;
      in[go]--;
      if(in[go]==0)
      q.push(go);
      }
      }
      }
      int main()
      {
      cin>>n>>m;
      for(int i=1;i<=m;i++)
      {
      int a,b;
      cin>>a>>b;
      add(a,b);
      in[b]++;
      eat[a]++;
      }
      topo();
      for(int i=1;i<=n;i++)
      {
      if(eat[i]==0)
      ans=(ans+d[i])%mod;
      }
      cout<<ans;
      }
      
      
      
  • 1
    @ 2023-6-6 18:55:19

    image image

    #include <bits/stdc++.h>
    #define mod 80112002
    using namespace std;
    const int N=5005;
    vector<int> e[N];
    int n,m,k,s,t,rd[N],cd[N],f[N]; 
    void add(int s,int t){
    	e[s].push_back(t);
    	rd[t]++;
    	cd[s]++;
    }
    int main()
    {
    	cin>>n>>m;
    	for (int i=1;i<=m;++i){
    		cin>>s>>t;
    		add(s,t);
    	}
    	queue<int> q;
    	//计算拓扑序 
    	for (int i=1;i<=n;++i)
    		if (rd[i]==0){
    			f[i]=1;
    			q.push(i);
    		}
    	//一边求拓扑序,一遍dp 
    	while (!q.empty()){
    		int x=q.front();
    		q.pop();
    		for (int &y:e[x]){
    			f[y]=(f[y]+f[x])%mod;
    			if (--rd[y]==0)	
    				q.push(y);
    		}
    	}
    	int ans=0;
    	//答案累加所有出度为0的点的f值 
    	for (int i=1;i<=n;++i)
    		if (cd[i]==0) ans=(ans+f[i])%mod;
    	cout<<ans<<endl;
    }
    
    • 0
      @ 2023-9-6 21:12:51
      #include <bits/stdc++.h>
      using namespace std;
      int n,m,in[100005],out[100005];
      vector<int> e[100005];
      queue<int> q;
      int f[100005];
      const int MOD = 80112002; 
      void dfs()
      {
      	while(!q.empty())
      	{
      		int u = q.front();
      		q.pop();
      		for(int i=0; i < e[u].size() ;i++)
      		{
      			int v = e[u][i];
      			f[v] = (f[v] + f[u]) % MOD;
      			in[v]--;
      			if(in[v] == 0)
      			{
      				q.push(v);
      			}
      		}
      	}
      }
      int main()
      {
      	cin >> n >> m;
      	for(int i=1; i <= m ;i++)
      	{
      		int v,u;
      		cin >> v >> u;
      		in[v]++;
      		out[u]++; 
      		e[u].push_back(v);
      	}
      	for(int i=1; i <= n;i++)
      	{
      		if(in[i] == 0)
      		{
      			q.push(i);
      			f[i] = 1; 
      		}
      	}
      	dfs();
      	int ans = 0;
      	for(int i=1; i <= n;i++)
      	{
      		if(out[i] == 0 && in[i] != 0)
      		    ans = (ans + f[i]) % MOD;
      	}
      	cout << ans;
      }
      
      • 0
        @ 2023-6-6 6:10:53

        核心代码

        int n,m,x,y,k,ans=0;
            cin>>n>>m;
            for(int i=1; i<=m; i++){
              cin>>x>>y;
              out[x]++;//出度
              in[y]++;//入度
              a[x][y]=1;
            }
            for(int i=1; i<=n; i++){//f[i]表示从食物链的起点到i有几条路
                if(in[i]==0){//此时i为食物链起点
                  f[i]=1;//i到i只有一条路线
                  q.push(i);//入读为0点入队
                }
            }
            while(!q.empty()){
                x=q.front();
                q.pop();
                for(int i=1; i<=n; i++){
                   if(a[x][i]){//找跟i相连结的点
                      in[i]--;//入度减1
                      a[x][i]=0;//删掉边
                      f[i]=(f[x]+f[i])%mod;
                      if(in[i]==0){
                          q.push(i);
                      }
                      if(in[i]==0&&out[i]==0){//已经到食物链的最高端
                         ans=(ans+f[i])%mod;
                      }
                   }
                }
            }
           
        }
        //拓扑排序
        
        • 1

        信息

        ID
        130
        时间
        1000ms
        内存
        125MiB
        难度
        4
        标签
        递交数
        115
        已通过
        50
        上传者