设为首页 加入收藏

TOP

UVA11080- Place the Guards(二分图染色)
2015-07-20 17:30:03 来源: 作者: 【 】 浏览:2
Tags:UVA11080- Place the Guards 二分 染色

题目链接


题意:放最少的士兵去监视所有的道路, 但士兵不可相邻,符合的话,就输出最少的士兵数,否则输出-1

思路:其实就是二分图染色,即黑白染色,然后选择黑白染色最少的那个颜色累加,但要注意可能有多个连通块,只要有一个连通块不符合的话,就不符合。

代码:

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; const int MAXN = 205; vector
       
         g[MAXN]; int color[MAXN]; int v, e, cur, num; bool bipartite(int u, int &cur, int &num) { num++; if (color[u] == 1) cur++; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (color[v] == color[u]) return false; if (!color[v]) { color[v] = 3 - color[u]; if (!bipartite(v, cur, num)) return false; } } return true; } int main() { int cas; scanf("%d", &cas); while (cas--) { scanf("%d%d", &v, &e); for (int i = 0; i < v; i++) g[i].clear(); int a, b; for (int i = 0; i < e; i++) { scanf("%d%d", &a, &b); g[a].push_back(b); g[b].push_back(a); } int flag = 1; int ans = 0; memset(color, 0, sizeof(color)); for (int i = 0; i < v; i++) { if (!color[i]) { num = cur = 0; color[i] = 1; if (!bipartite(i, cur, num)) { flag = 0; break; } if (num == 1) ans++; else { ans += min(cur, num - cur); } } } if (flag) printf("%d\n", ans); else printf("-1\n"); } return 0; }
       
      
     
    
   
  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BZOJ 2599 IOI2011 Race 树的点分.. 下一篇HDoj-1042 大数阶乘

评论

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

·HyperText Transfer (2025-12-26 07:20:48)
·半小时搞懂 HTTP、HT (2025-12-26 07:20:42)
·CPython是什么?PyPy (2025-12-26 06:50:09)
·Python|如何安装seab (2025-12-26 06:50:06)
·python要学习数据分 (2025-12-26 06:50:03)