最小生成树(星际游击队,uva 1279)
来源:互联网 发布:网吧计费系统c语言 编辑:程序博客网 时间:2024/04/27 17:25
真的醉了。。。
写了好久,然后WA。
万念俱灰,抱着搞笑的心态改了一行代码,决定WA一发然后睡觉去。。
改的是这个
typedef long long ll;
改成
typedef double ll;
然后交了,准备放弃。。
然后AC了。。。
当时就是觉得会不会long long不够大啊
改成double虽然精度更低了但是能表示的数更大了,而且在数极大的情况下对精度的要求应该不会很高。
结果真的过了。。。
哈哈,真开心。
╰( ̄▽ ̄)╭
ヽ(•̀ω•́ )ゝ
(⁎˃ᴗ˂⁎)
o(≧ω≦)o
ヾ(o◕∀◕)ノ
别人家的代码http://www.tqcto.com/article/internet/7947.html
乱起八糟的代码
#include<stdio.h>#include<vector>#include<algorithm>#include<string.h>#include<math.h>#define maxn 55#define maxm 2500using namespace std;typedef double ll;const double T=5e-7;const double xiao=5e-8;struct pt{ ll x,y,z,ax,ay,az; pt(ll a,ll b,ll c,ll d,ll e,ll f):x(a),y(b),z(c),ax(d),ay(e),az(f){}};vector<pt>pts;int n,m;struct Edge{ int from,to; ll dist; Edge(int a,int b,ll c):from(a),to(b),dist(c){} bool operator < (const Edge& rhs) const { return dist<rhs.dist; }};vector<Edge>edges;int kase;ll u[maxm],v[maxm],p[maxn],r[maxm];double w[maxm];vector<int>in[2];int cmp(const int i,const int j){return w[i]<w[j];}int find(int x){return p[x]==x?x:p[x]=find(p[x]);}double Kruskal(int k){ double ans=0; for(int i=0;i<n;i++) p[i]=i; for(int i=0;i<m;i++) r[i]=i; sort(r,r+m,cmp); for(int i=0;i<m;i++) { int e=r[i]; int x=find(u[e]); int y=find(v[e]); if(x!=y){ans+=w[e];p[x]=y;in[k].push_back(e);} } return ans;}double DIST(int u,int v,double t){ pt a=pts[u]; pt b=pts[v]; double x1=a.x+t*a.ax; double y1=a.y+t*a.ay; double z1=a.z+t*a.az; double x2=b.x+t*b.ax; double y2=b.y+t*b.ay; double z2=b.z+t*b.az; double x=x1-x2; double y=y1-y2; double z=z1-z2; return sqrt(x*x+y*y+z*z);}bool OK(){ for(unsigned int i=0;i<in[0].size();i++) { bool you=false; for(unsigned int j=0;j<in[1].size();j++) if(in[0][i]==in[1][j]) {you=true;break;} if(!you) return true; } return false;}bool ok(int a,int b,double t){ if(t<0) return false; t-=xiao; in[0].clear(); in[1].clear(); for(unsigned int i=0;i<edges.size();i++) { Edge& e=edges[i]; u[i]=e.from; v[i]=e.to; w[i]=DIST(e.from,e.to,t); } Kruskal(0); bool zai=false; for(unsigned int i=0;i<in[0].size();i++) { if(in[0][i]==a) zai=true; if(in[0][i]==b) return false; } if(!zai) return false; for(unsigned int i=0;i<edges.size();i++) { Edge& e=edges[i]; u[i]=e.from; v[i]=e.to; w[i]=DIST(e.from,e.to,t+T+xiao); } Kruskal(1); for(unsigned int i=0;i<in[0].size();i++) { bool you=false; for(unsigned int j=0;j<in[1].size();j++) if(in[0][i]==in[1][j]) {you=true;break;} if(!you) return true; } return false;}struct Node{ double t; int u,v; Node(double c,int a,int b):t(c),u(a),v(b){} bool operator < (const Node& rhs) const { return t<rhs.t; }};vector<Node>node;int main(){ while(scanf("%d",&n)!=EOF) { node.clear(); m=0; pts.clear(); edges.clear(); ll a,b,c,d,e,f; for(int i=0;i<n;i++) { scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f); pts.push_back(pt(a,b,c,d,e,f)); } for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { pt& a=pts[i]; pt& b=pts[j]; ll x=a.x-b.x; ll y=a.y-b.y; ll z=a.z-b.z; ll D=x*x+y*y+z*z; edges.push_back(Edge(i,j,D)); m++; } int cnt=0; sort(edges.begin(),edges.end()); for(unsigned int i=0;i<edges.size();i++) for(unsigned int j=i+1;j<edges.size();j++) { Edge e=edges[i]; pt a=pts[e.from]; pt b=pts[e.to]; ll x1=a.x-b.x; ll xa1=a.ax-b.ax; ll y1=a.y-b.y; ll ya1=a.ay-b.ay; ll z1=a.z-b.z; ll za1=a.az-b.az; e=edges[j]; a=pts[e.from]; b=pts[e.to]; ll x2=a.x-b.x; ll xa2=a.ax-b.ax; ll y2=a.y-b.y; ll ya2=a.ay-b.ay; ll z2=a.z-b.z; ll za2=a.az-b.az; double A=xa2*xa2-xa1*xa1+ya2*ya2-ya1*ya1+za2*za2-za1*za1; double B=2*(x2*xa2-x1*xa1+y2*ya2-y1*ya1+z2*za2-z1*za1); double C=x2*x2-x1*x1+y2*y2-y1*y1+z2*z2-z1*z1; if(A==0) { if(B<0) node.push_back(Node(-C/B,i,j)); } else { double deta=B*B-4*A*C; if(deta>=0) { deta=sqrt(deta); if(A>0) { if((-B+deta)/(2*A)>0) node.push_back(Node((-B+deta)/(2*A),j,i)); if((-B-deta)/(2*A)>0) node.push_back(Node((-B-deta)/(2*A),i,j)); } else node.push_back(Node((-B-deta)/(2*A),i,j)); } } } /*printf(" "); for(unsigned int i=0;i<node.size();i++) printf("%lf ",node[i].t); puts("");*/ sort(node.begin(),node.end()); in[0].clear(); for(unsigned int i=0;i<edges.size();i++) { Edge& e=edges[i]; u[i]=e.from; v[i]=e.to; w[i]=DIST(e.from,e.to,0); } Kruskal(0); for(unsigned int i=0;i<node.size();i++) { double t=node[i].t; bool zai=false; bool xing=true; int a=node[i].u; int b=node[i].v; for(unsigned int j=0;j<in[0].size();j++) { if(in[0][j]==a) zai=true; if(in[0][j]==b) xing=false; } if(!zai) xing=false; if(!xing) continue; in[1].clear(); for(unsigned int j=0;j<edges.size();j++) { Edge& e=edges[j]; u[j]=e.from; v[j]=e.to; w[j]=DIST(e.from,e.to,t+T); } Kruskal(1); if(OK()) { cnt++; in[0].clear(); for(unsigned int j=0;j<in[1].size();j++) in[0].push_back(in[1][j]); } } printf("Case %d: %d\n",++kase,cnt+1); } return 0;}
0 0
- 最小生成树(星际游击队,uva 1279)
- UVA1279,Asteroid Rangers,星际游击队,好烦的最小生成树
- nyoj 127 星际之门(一)【最小生成树】
- 星际之门(一)【最小生成树个数】
- UVA1279星际游击队推导过程
- uva 10048 Audiophobia(最小生成树)
- UVA, 11733 (kruscal,最小生成树)
- uva 534 - Frogger(最小生成树)
- Uva 10369 (最小生成树)
- UVA-1395(最小瓶颈生成树)
- UVA 10369 最小生成树
- uva 10397(最小生成树)
- uva 10034(最小生成树)
- uva 10369(最小生成树)
- UVa 1395 最小生成树
- uva 1151最小生成树
- uva 10369 最小生成树
- 最小生成树(苗条生成树 uva 1395)
- 商品订购系统时出现的问题汇总 not-null property references a null or transient value 等
- 新组件
- Android开发之媒体扫描详细解析(上)
- 手机系统应用STK 问题总结
- 什么是Qt(二)
- 最小生成树(星际游击队,uva 1279)
- SPI实现SST25VF016B驱动(Flash)
- 02全栈工程师--2016-08-05
- Makefile之学习总结(5)--- Makefile (v4.0)
- python实战技巧2:Unable to find vcvarsall.bat
- Java计算器--CALance
- 紧急呼叫概述&自适应需求实现
- MySQL半同步复制
- 对于双向链表的NULL的一些研究