2 条题解

  • 0
    @ 2026-7-12 14:17:23
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e4+10;
    vector<int>e[N];queue<int>q;
    int rd[N],f[N],cnt;
    int main()
    {
    	int n,m;scanf("%d%d",&n,&m);
    	for(int i=1,a,b;i<=m;i++)
    	{
    		scanf("%d%d",&a,&b);
    		e[b].push_back(a);rd[a]++;
    	}
    	for(int i=1;i<=n;i++)if(rd[i]==0)
    		q.push(i),f[i]=100,cnt++;
    	while(!q.empty())
    	{
    		int x=q.front();q.pop();
    		for(int y:e[x])
    		{
    			rd[y]--;
    			if(rd[y]==0)
    			{
    				f[y]=f[x]+1;
    				cnt++;q.push(y);
    			}
    		}
    	}
    	if(cnt==n)
    	{
    		int ans=0;
    		for(int i=1;i<=n;i++)ans+=f[i];
    		printf("%d\n",ans);
    	}
    	else puts("Poor Xed");
    	return 0;
    }
    
    • 0
      @ 2026-6-14 14:31:46

      
      // 拓扑排序 O(n)
      #include<bits/stdc++.h>
      using namespace std;
      
      const int N=10010;
      int n,m,cnt;
      vector<int> e[N];
      int rd[N],d[N];
      
      bool topo(){
        for(int i=1;i<=n;i++) d[i]=100; //各点初值
        queue<int> q;
        for(int i=1; i<=n; i++) if(!rd[i]) q.push(i);
        while(!q.empty()){
          int u=q.front(); q.pop();
          cnt++; //记录点数
          for(auto v:e[u]){
            d[v]=max(d[v],d[u]+1); //起点到v的最长路
            if(--rd[v]==0) q.push(v); //入度为0 则入队
          }
        }
        return cnt==n;
      }
      int main(){
        cin>>n>>m;
        for(int i=1,a,b; i<=m; i++){
          cin>>a>>b;
          e[b].push_back(a); //从b向a连边
          rd[a]++; //记录入度
        }
        if(topo()){ //如果拓扑排序成功
          int ans=0;
          for(int i=1; i<=n; i++) ans+=d[i];
          cout<<ans;
        }
        else puts("Poor Xed");
      }
      
      • 1

      信息

      ID
      12487
      时间
      1000ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      26
      已通过
      8
      上传者