zoukankan      html  css  js  c++  java
  • 数树 学习笔记

    CSDN同步

    没有找到网上的题目,应该是道民间练习题。

    并不是本人写的题,只是转载清晰一点吧。

    原题链接

    简要题意:

    给定一个无向图,求连通块为树的个数。

    显然,对于一个连通块,只要不出现环 那它就是树了。

    那么就异常简单,一个个 ( ext{dfs}) 就搞定了。

    时间复杂度:(O(n+m)).

    实际得分:(100pts).

    细节:孤点也算一个连通块,也算一棵树。

    #pragma GCC optimize(2)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=1e5+1; 
    
    inline int read(){char ch=getchar(); int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
    	int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
    
    vector<int> G[N];
    bool h[N],f=0; 
    int n,m,s=0;
    
    inline void dfs(int dep,int last) { //last 为上一个点
    	if(h[dep]) return;
    	h[dep]=1; //printf("%d %d
    ",dep,last);
    	//h 记录是否走过
    	for(int i=0;i<G[dep].size();i++) {
    		int u=G[dep][i];
    		if(h[u] && u!=last) f=1; //出现环显然不行
    		dfs(u,dep); //否则继续走
    	}
    }
    
    int main() {
    //	freopen("tree.in","r",stdin);
    //	freopen("tree.out","w",stdout);
    	n=read(),m=read(); while(m--) {
    		int u=read(),v=read();
    		G[u].push_back(v);
    		G[v].push_back(u);
    	} for(int i=1;i<=n;i++)
    		if(!h[i]) { f=0;
    			dfs(i,-1);
    			if(!f) s++/*,printf("%d
    ",i)*/;
    		} printf("%d
    ",s);	
    	return 0;
    }
    
    
  • 相关阅读:
    闲扯 Javascript 01 实现选项卡
    控制台获得键盘事件
    C#反射 入门学习 02
    C#反射 入门学习 01
    闲扯 Javascript 00
    读张子阳老师的委托和事件 2
    浅析ado.net获取数据库元数据信息 DeriveParameters
    SQLBulkCopy使用
    利用CryptoStream进行加密解密
    vs 中代码的字体也颜色设置
  • 原文地址:https://www.cnblogs.com/bifanwen/p/12813887.html
Copyright © 2011-2022 走看看