Codeforces Round #346 (Div. 2)E. New Reform 乱搞dfs
2016-04-01 12:18
302 查看
dfs分成个个区间,每个区间不存在环结果加1.
判断环,1 a,b两点间有两条以上的路。
2.a,b有一条路径,且b此时已走过且b不是搜索这条路时走到a的前一个点
判断环,1 a,b两点间有两条以上的路。
2.a,b有一条路径,且b此时已走过且b不是搜索这条路时走到a的前一个点
#include<cstdio> #include<cstring> #include<map> #include<algorithm> using namespace std; map<int,int>mp[110000]; int next[200000],link[200000],n,m,co[200000],l,last[200000]; bool sym[200000],sym2; void init() { l = 0; memset(next,-1,sizeof(next)); memset(co,0,sizeof(co)); memset(sym,0,sizeof(sym)); } void add(int a,int b) { link[l] = b; last[l] = next[a]; next[a] = l; l++; } void dfs(int Last,int pre) { co[pre] = 1; for(int i=next[pre];i!=-1;i = last[i]) { if(!co[link[i]])dfs(pre,link[i]); else if(sym[link[i]]==true)sym2 = true; else if(link[i]!=Last)sym2 = true; } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int sum = 0; init(); int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); add(a,b); add(b,a); mp[a][b]++; mp[b][a]++; if(mp[a][b]>=2) { sym[a] = true; sym[b] = true; } } for(int i=1;i<=n;i++) if(!co[i]) { sym2 = false; dfs(i,i); if(!sym2)sum++; } printf("%d\n",sum); for(int i=1;i<=n;i++) mp[i].clear(); } return 0; }
相关文章推荐
- WebView
- 240. Search a 2D Matrix II
- js正则函数match、exec、test、search、replace、split使用介绍集合
- 设计模式介绍
- HDU-1016-Prime Ring Problem
- VC 三点 划 曲线
- JSP中input内容改变触发onchange事件使用
- linux下程序调试使用文件重定向
- No permission to write APN settings: Neither user *** nor current process has android.permission.WRITE_APN_SETTINGS.
- 网络请求数据问题
- VC 类泡泡龙游戏算法
- HDU-2553-N皇后问题
- Codeforces 368B Sereja and Suffixes
- 关于HTML中的title换行问题
- 【撸码师的备忘录】 Java bean 与 xml 互相转化-JDK Marshaller
- 10分钟-JavaWeb入门-登陆功能实现
- poj-2828 Buy Tickets【线段树】
- 罗马数字转换成整数
- nginx+php测试时显示 502 bad gateway的解决方法
- maven中解决javax.servlet.jsp.PageContext cannot be resolved to a type