1 条题解
-
0
解题思路
找到每个点的出度,如果该节点所有连接的节点均不连通,那么这个节点也不联通。加边时要反向加边,因为我们要遍历指向该节点的边,对所有不能作为联通点的进行广搜,每次对它的出度减少,当它无点可连时,就对这个点进行标记,最后没被标记的点的个数就是我们的答案。
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
- 上传者