2017年2月18日晚解题报告
来源:互联网 发布:mysql timestamp 编辑:程序博客网 时间:2024/05/29 13:57
T1:
分析:
首先看题,发现是一道很简单的欧拉回路题目,O(∩_∩)O,心中窃喜,结果一看数据范围,看不懂的小,纠结了半天,也没想到什么算法让数据最大只有20,只有打了一个欧拉回路.结果居然A了,orz,真是迷啊!
code:
#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;void setIO(const string&a) { freopen((a+".in").c_str(),"r",stdin); freopen((a+".out").c_str(),"w",stdout);}#include<vector>vector<int> G[15];int cnt=0,head,tail;int n,m;bool dfs(int u,int pre) { int next=0; for(unsigned i=0;i<G[u].size();i++) { cnt++; int v=G[u][i]; if(v==pre) continue; if(pre) { if(!next) next=v; else if(next!=v) return 0; }else { if(!next) next=v; else if(!tail) tail=v; else return 0; } } if(u==tail) return next==head&&cnt==m*2; return dfs(next,u);}int main() { setIO("circuit"); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } for(int i=1;i<=n;i++) { if(G[i].size()) { head=i; printf("%s\n",dfs(i,0)?"YES":"NO"); return 0; } }}
T2:
分析:
刚拿到这题发现是一道MST的模板题,但是看到是一张完全图且n最大是1e5,所以我们肯定不能把所有的边都求出来,那么考虑删边,一开始我以为从他定义的距离考虑,后来发现不行,那么这题可以转化成从(n^2-1)条边中选择(n-1)条边的问题.此时我们可以考虑给x,y,z排序,然后建边,用kruskal求解.
解法的证明:
我们需要满足每辆个点有且仅有一条边,所以我们排序后选择每两个相邻的点之间的距离,因为若中间相隔必然没有相邻优.而对于这样是否能建成一个树也是很显然的.因为相邻两点必然两两不同,所以一定会有树.至于排三次序后出现环的话,可以用并查集解决.
Code:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int MAXN=300000+10;struct ex{ int x,id; bool operator < (const ex &a){ return a.x>x; }}ex[MAXN];struct ey{ int y,id; bool operator < (const ey &a){ return a.y>y; }}ey[MAXN];struct ez{ int z,id; bool operator < (const ez &a){ return a.z>z; }}ez[MAXN];int n,fa[MAXN];int find(int x){ return fa[x]==x?fa[x]:fa[x]=find(fa[x]);}struct edge{ int from,to,val; edge(int from=0,int to=0,int val=0):from(from),to(to),val(val){}}e[MAXN*2];bool cmp(const edge &a,const edge& b){ return a.val<b.val;}int len=0;void kruskal(){ long long ans=0; fo(i,1,len){ int u=e[i].from,v=e[i].to; int x=find(u),y=find(v); if(x==y) continue; else{ ans+=e[i].val; fa[x]=y; } } printf("%d",ans);}int main(){ freopen("space.in","r",stdin); freopen("space.out","w",stdout); scanf("%d",&n); fo(i,1,n){ fa[i]=i; ex[i].id=i; ey[i].id=i; ez[i].id=i; scanf("%d%d%d",&ex[i].x,&ey[i].y,&ez[i].z); } sort(ex+1,ex+1+n); sort(ey+1,ey+1+n); sort(ez+1,ez+1+n); fo(i,2,n){ e[++len]=edge(ex[i-1].id,ex[i].id,abs(ex[i].x-ex[i-1].x)); e[++len]=edge(ey[i-1].id,ey[i].id,abs(ey[i].y-ey[i-1].y)); e[++len]=edge(ez[i-1].id,ez[i].id,abs(ez[i].z-ez[i-1].z)); } sort(e+1,e+1+len,cmp); kruskal(); return 0;}
T3
还没改完
continue—–
0 0
- 2017年2月18日晚解题报告
- 2017年2月26日第二次周考 解题报告
- 2017年3月5日 周考3 解题报告
- 8月1日解题报告
- 10月28日考试解题报告
- 10月30日解题报告
- 10月31日解题报告
- 11月03日解题报告
- 11月02日解题报告
- 11月04日解题报告
- 11月05日解题报告
- 11月06日解题报告
- 2013年3月17日 周赛 解题报告 -- from lanshui_Yang
- 2013年3月24日 周赛 解题报告 -- from lanshui_Yang
- 5月6日动态规划测试解题报告
- 【中期报告】2014年CSDN开源夏令营(7月6日~8月2日)中期报告
- 【RqOct月赛】解题报告
- 四月月赛解题报告
- Git基础 4 —— 分支开发工作流
- POI导出excel提示ClassNotFoundException: org.apache.commons.codec.digest.DigestUtils
- php-fpm进程关闭与重启
- 排序算法的分类及简单比较
- buildbot 配置
- 2017年2月18日晚解题报告
- 产生多路不同频率方波
- 解决IDEA IntelliJ注册码冲突的问题
- SSE2 memcpy
- Kafka 设计与原理详解
- RabbitMQ~广播消息
- qt widget 窗口句柄的问题
- 关于中值滤波算法,以及C语言实现
- 程序员如何判断是否到了该辞职的时候?