Power OJ 魔术球问题
来源:互联网 发布:苹果音频编辑软件 编辑:程序博客网 时间:2024/06/05 20:50
嗯,如果i+j为平方数的话,就代表可以连边
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 1600;const int inf = 1e9;int n,m;bool is_square(int x){ int m = sqrt(x); return m*m == x;}bool vis[MAXN];int match[MAXN];vector<int>head[MAXN];bool dfs(int u){ for(auto v : head[u]) { if(!vis[v]) { vis[v] = 1; if(match[v] == -1 || dfs(match[v])) { match[v] = u; return 1; } } } return 0;}int check(int n){ for(int i = 1; i < n; ++i)if(is_square(i+n))head[i].push_back(n); for(int i = 1; i <= n; ++i)match[i] = -1; int ans = 0; for(int i = 1; i <= n; ++i) { fill(vis+1,vis+1+n,0); if(dfs(i))ans++; } return n - ans;}int main(){ scanf("%d",&n); for(int i = 1; i <= n; ++i) for(int j = i+1; j <= n; ++j) { if(is_square(i+j))head[i].push_back(j); } int ans = n+1; while(check(ans) <= n)ans++; ans--; check(ans); printf("%d\n",ans); stack<int>q; for(int i = ans; i >= 1; --i) { if(match[i] >= 1) { int v = i,u; while(match[v] >= 1) { q.push(v); u = match[v]; match[v] = 0; v = u; } printf("%d",v); match[v] = 0; while(!q.empty())printf(" %d",q.top()),q.pop(); puts(""); } else if(match[i] == -1)printf("%d\n",i); } return 0;}
阅读全文
0 0
- Power OJ 魔术球问题
- Power OJ 1742试题库问题
- swust1739: 魔术球问题
- 【codevs1234】魔术球问题
- 魔术球问题
- P2765 魔术球问题
- luogu2765 魔术球问题
- 魔术球问题
- 魔术球问题 网络流
- 魔术球问题(网络24题,三)
- 【网络流24题】魔术球问题
- 【网络流24题】魔术球问题
- 【网络流24题】魔术球问题
- 2017.3.25 魔术球问题 思考记录
- cogs 魔术球问题(简化版)
- [网络流24题]魔术球问题
- Power oj 1782
- power oj 2505
- 嵌入式Linux驱动笔记(十三)------spi设备之RFID-rc522驱动
- java 8 总结 之lambda
- 1082: 敲7(多实例测试)
- 记录一个自己用的添加excel内容的类
- ArcEngine数据删除几种方法和性能比较
- Power OJ 魔术球问题
- 【POJ1201】Intervals-差分约束系统+单源最长路
- python3.6+pyqt5实现GUI设计(二)
- 商城项目-dubbo,框架整合,dubbo发布和引用服务
- Eclipse4.7创建Maven项目报错解决方法
- 算法提高 ADV-156 分分钟的碎碎念
- 数据挖掘 日期转换表
- 1083: 数值统计(多实例测试)
- 车牌识别相机的算法开发与调用例程