Lightoj 1009
2016-06-12 23:22
281 查看
题意: 两方战争,求可能最大的一方军队人数。
思路: 看了一下别人的代码,是用二分图染色写的。
AC代码:
思路: 看了一下别人的代码,是用二分图染色写的。
AC代码:
//Lightoj 1009 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #define ll long long #define llu unsigned long long #define INF 0x3f3f3f using namespace std; const int maxn=20010; vector<int>g[maxn],v[maxn]; int vis[maxn]; int color[maxn]; int cnt; void init() { cnt=0; for(int i=1; i<=maxn; i++) { vis[i]=0; color[i]=0; g[i].clear(); v[i].clear(); } } void dfs(int x,int r) { int s=g[x].size(); for(int i=0; i<s; i++) { int t=g[x][i]; if(vis[t] && !color[t]) { v[cnt].push_back(t); color[t]=3-r; dfs(t, color[t]); } } } int main(){ int t; int n; scanf("%d",&t); for(int cas=1; cas<=t; cas++) { init(); int Max=-1; scanf("%d",&n); for(int i=1; i<=n; i++) { int u,v; scanf("%d%d",&u,&v); Max=max(Max,max(v,u)); vis[u]=1; vis[v]=1; g[u].push_back(v); g[v].push_back(u); } for(int i=1; i<=Max; i++) { if(vis[i] && !color[i]) { cnt++; v[cnt].push_back(i); color[i]=1; dfs(i,1); } } int ans=0; for(int i=1; i<=cnt; i++) { int c1=0,c2=0; for(int j=0; j<v[i].size(); j++) { if(color[v[i][j]]==1) c1++; if(color[v[i][j]]==2) c2++; } ans+=max(c1,c2); } printf("Case %d: %d\n",cas,ans); } return 0; }
相关文章推荐
- SQL限定查询
- SQL Server常用管理命令
- 第三课、key的操作
- [Android]使用BeanShell实现Android简易科学计算器
- 【Linux】tar指令用法
- 王爽《汇编语言》第十一章 实验十一 题目解答
- border:1px #F00 solid;
- js 数组去重
- NodeMCU实现远程控制LED灯
- adb调试出现的问题
- SQL中EXISTS的用法
- linux vdso与vsyscall相关内容总结
- div水平居中和垂直居中
- 3.1按钮
- 梦断代码阅读笔记02
- POJ1416 DFS+剪枝
- pdo中几种查询方式的区别
- 梳理mybatis-面试题
- JDBC数据库连接池之dbcp
- tcp