1 条题解

  • 0
    @ 2026-7-1 15:00:19

    解题思路

    找到每个点的出度,如果该节点所有连接的节点均不连通,那么这个节点也不联通。加边时要反向加边,因为我们要遍历指向该节点的边,对所有不能作为联通点的进行广搜,每次对它的出度减少,当它无点可连时,就对这个点进行标记,最后没被标记的点的个数就是我们的答案。

    code:

    #include<bits/stdc++.h>
    #define int long long 
    using namespace std;
    const int N=1e6+10;
    int n,m;
    int e[N],ne[N],h[N],idx;
    int r[N],c[N];
    bool vis[N],Vis[N];
    int ans;
    int mx;
    //map<int,int> mp;
    void add(int a,int b){
    	e[idx]=b;
    	ne[idx]=h[a];
    	h[a]=idx++;
    }
    queue<int> q;
    signed main(){
    	std::ios::sync_with_stdio(false);
    	cin.tie(0);
    	memset(h,-1,sizeof(h));
    	cin>>n>>m;
    	int u,v;
    	for(int i=1;i<=m;i++){
    		cin>>u>>v;
    		add(v,u);
    		r[u]++;
    	}
    	for(int i=1;i<=n;i++){
    		if(!r[i]){
    			q.push(i);
    			vis[i]=true;
    		}
    	}
    	while(!q.empty()){
    		int u=q.front();
    		q.pop();
    		for(int i=h[u];i!=-1;i=ne[i]){
    			int j=e[i];
    			r[j]--;
    			if(!r[j]){
    				q.push(j);
    				vis[j]=true;
    			}
    		}
    	}
    	ans=0;
    	for(int i=1;i<=n;i++){
    		if(!vis[i]) ans++;
    	}	
    	cout<<ans<<endl;
    	return 0;
    }
    /*
    5 6
    2 3
    1 2
    2 4
    4 3
    3 5
    5 1
    */
    
    • 1

    信息

    ID
    12435
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    7
    已通过
    3
    上传者