设为首页 加入收藏

TOP

poj2924--F - Knights of the Round Table(圆桌骑士,经典连通分量)(二)
2015-07-20 17:49:14 来源: 作者: 【 】 浏览:6
Tags:poj2924--F Knights the Round Table 圆桌 骑士 经典 连通 分量
2200 struct node{ int u , v ; int next ; } edge[2100000]; int head[maxn] , cnt , vis[2100000] ; int temp[maxn] , color[maxn] ; int dnf[maxn] , low[maxn] , time ; int Map[maxn][maxn] , ans[maxn] ; stack sta; vector vec[maxn] ; int num ; void init() { memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); memset(Map,0,sizeof(Map)); memset(dnf,0,sizeof(dnf)); memset(low,0,sizeof(low)); memset(temp,0,sizeof(temp)); memset(ans,0,sizeof(ans)); cnt = time = num = 0 ; } void add(int u,int v) { while( !sta.empty() ) sta.pop(); edge[cnt].u = u ; edge[cnt].v = v ; edge[cnt].next = head[u] ; head[u] = cnt++ ; edge[cnt].u = v ; edge[cnt].v = u ; edge[cnt].next = head[v] ; head[v] = cnt++ ; } void tarjan(int u) { dnf[u] = low[u] = ++time ; int i , j , v ; for(i = head[u] ; i != -1 ; i = edge[i].next) { if(vis[i]) continue ; vis[i] = vis[i^1] = 1 ; v = edge[i].v ; if( !dnf[v] ) { sta.push(i) ; tarjan(v); low[u] = min( low[u],low[v] ) ; if( low[v] >= dnf[u] ) { num++ ; vec[num].clear(); while(1) { j = sta.top(); sta.pop(); vec[num].push_back(edge[j].u); vec[num].push_back(edge[j].v); if( edge[j].u == u && edge[j].v == v ) break; } } } else if( dnf[v] < dnf[u] ) { sta.push(i) ; low[u] = min( low[u],dnf[v] ); } } } int dey(int u,int k) { int i ,v ; for(i = head[u] ; i != -1 ; i = edge[i].next) { v = edge[i].v ; if( temp[v] != k ) continue ; if( color[v] == color[u] ) return 0 ; if( !color[v] ) { color[v] = 3 - color[u] ; if( !dey(v,k) ) return 0 ; } } return 1 ; } int main() { int n , m , u , v , i , j ; while(scanf("%d %d", &n, &m) && (n+m) != 0 ) { init(); while(m--) { scanf("%d %d", &u, &v); Map[u][v] = Map[v][u] = 1 ; } for(i = 1 ; i <= n ; i++) for(j = i+1 ; j <= n ; j++) if( !Map[i][j] ) add(i,j); for(i = 1 ; i <= n ; i++) if( !dnf[i] ) tarjan(i); for(i = 1 ; i <= num ; i++) { if( vec[i].size() < 3 ) continue ; for(j = 0 ; j < vec[i].size() ; j++) temp[ vec[i][j] ] = i ; memset(color,0,sizeof(color)); u = vec[i][0] ; color[u] = 1 ; if( !dey(u,i) ) { for(j = 0 ; j < vec[i].size(); j++) ans[ vec[i][j] ] = 1 ; } } m = n ; for(i = 1 ; i <= n ; i++) if( ans[i] ) m-- ; printf("%d\n", m); } return 0; }


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++设计模式之适配器模式(二) 下一篇golang tcp 2 unix socket proxy

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何利用Python做数 (2025-12-24 23:48:36)
·如何使用python进行 (2025-12-24 23:48:34)
·python 爬虫入门该怎 (2025-12-24 23:48:31)
·Java 实现多个大文件 (2025-12-24 23:22:00)
·Java多线程编程在工 (2025-12-24 23:21:56)