最小生成树(星际游击队,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
原创粉丝点击