|
沙发
楼主 |
发表于 2021-3-30 09:44:53
|
只看该作者
用简单的图的DFS方法,类似种子填充算法来做是可行的。
考察读入建图的基本功和基本的DFS方法。
- /// 2097种子填充算法
- #include <bits/stdc++.h>
- using namespace std;
- const int mn=100010;
- const int mm=400010; // 双向边注意开2倍
- int n,m,cnt;
- int nbs[mn],vis[mn];
- int ev[mm],nxt[mm]; // eu和ew都无必要
- void readmap()
- {
- int u,v;
- cin>>n>>m;
- for (int i=1; i<=n; i++) nbs[i]=vis[i]=0;
- for (int i=1; i<=m; i++)
- {
- cin>>u>>v;//双向边
- ev[i]=v,nxt[i]=nbs[u],nbs[u]=i;
- ev[i+m]=u,nxt[i+m]=nbs[v],nbs[v]=i+m;
- }
- }
- void showmap() //检查建图情况
- {
- for (int i=1; i<=n; i++)
- {
- cout<<i<<':';
- for (int j=nbs[i]; j; j=nxt[j]) cout<<setw(3)<<ev[j]<<' ';
- cout<<endl;
- }
- }
- void dfs(int p)
- {
- vis[p]=cnt;
- for (int i=nbs[p]; i!=0; i=nxt[i])
- {
- int v=ev[i]; //常规无聊直观操作
- if (vis[v]==0)dfs(v);
- }
- }
- void pp()
- {
- for(int i=1; i<=n; i++) cout<<setw(3)<<vis[i];
- cout<<endl;
- }
- int main()
- {
- readmap();
- //showmap();
- cnt=0;
- for(int i=1; i<=n; i++)
- {
- if (vis[i]==0)
- {
- ++cnt;
- dfs(i);
- }
- }
- cout<<cnt;
- return 0;
- }
- /*
- 4 5
- 1 2
- 1 3
- 2 3
- 2 1
- 3 4
- */
复制代码 |
|