Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC啦啦啦,果断贴代码。Source Code Problem: 2130 User: JiaJunpeng Memory: 5276K Time: 3125MS Language: C++ Result: Accepted Source Code #include<iostream> #include<cstdlib> #include<cstring> #include<stdio.h> #include<cmath> #include<algorithm> #include<vector> using namespace std; int n,cnt,pa[100000],ans[10000],ncnt,adj[11000][100],num[100000],f[100][11000],cont[100]; double v1,v2,ru,ru1,ru2,dp[100000],t1[100],t2[100],eps=1e-7; struct point { double x,y; int id,id1,id2; }; point list[100000]; bool visit[100000]; double dist(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double dijkstra() { int i,j,s,p,q,u,id; double in; for(i=0;i<cnt;i++) dp[i]=1000000000; dp[0]=0.000; memset(visit,false,sizeof(visit)); while(true) { in=1000000000; for(i=0;i<cnt;i++) { if(visit[i]==false&&in>dp[i]) { u=i; in=dp[i]; } } if(u==1) return dp[u]; visit[u]=true; for(int ii=0;ii<num[u];ii++)//for(i=0;i<cnt;i++) { i=adj[u][ii]; double val,vs1,vs2; if(list[u].id==list[i].id) val=dist(list[u].x,list[u].y,list[i].x,list[i].y)/(v1+v2); else { if(list[u].id==0||list[u].id==n+1) vs1=0; else vs1=t2[list[u].id]; if(list[i].id==0||list[i].id==n+1) vs2=0; else vs2=t1[list[i].id]; val=vs1+vs2+dist(list[u].x,list[u].y,list[i].x,list[i].y)/v1; } if(dp[i]>dp[u]+val) { dp[i]=dp[u]+val; pa[i]=u; } } id=list[u].id; for(int ii=0;ii<cont[id];ii++) { i=f[id][ii]; double val,vs1,vs2; if(list[u].id==list[i].id) val=dist(list[u].x,list[u].y,list[i].x,list[i].y)/(v1+v2); else { if(list[u].id==0||list[u].id==n+1) vs1=0; else vs1=t2[list[u].id]; if(list[i].id==0||list[i].id==n+1) vs2=0; else vs2=t1[list[i].id]; val=vs1+vs2+dist(list[u].x,list[u].y,list[i].x,list[i].y)/v1; } if(dp[i]>dp[u]+val) { dp[i]=dp[u]+val; pa[i]=u; } } } } int main() { double xa,ya,xb,yb,v,x1[100],y1[100],x2[100],y2[100]; int i,j,s,p,q; scanf("%d",&n); scanf("%lf%lf%lf%lf%lf%lf",&xa,&ya,&xb,&yb,&v1,&v2); for(i=1;i<=n;i++) scanf("%lf%lf%lf%lf%lf%lf",&x1[i],&y1[i],&x2[i],&y2[i],&t1[i],&t2[i]); swap(v1,v2); cnt=0; list[cnt].x=xa; list[cnt].y=ya; list[cnt].id1=list[cnt].id2=list[cnt].id=0; cnt++; list[cnt].x=xb; list[cnt].y=yb; list[cnt].id1=list[cnt].id2=list[cnt].id=n+1; cnt++; v=sqrt(2*v1*v2+v2*v2); memset(num,0,sizeof(num)); memset(cont,0,sizeof(cont)); adj[0][num[0]++]=1; adj[1][num[1]++]=0; for(i=1;i<=n;i++) { ru=v1*((x2[i]-x1[i])*(ya-y1[i])-(y2[i]-y1[i])*(xa-x1[i]))/v-(x1[i]-xa)*(x2[i]-x1[i])-(y1[i]-ya)*(y2[i]-y1[i]); ru/=((x2[i]-x1[i])*(x2[i]-x1[i])+(y2[i]-y1[i])*(y2[i]-y1[i])); list[cnt].x=x1[i]+ru*(x2[i]-x1[i]); list[cnt].y=y1[i]+ru*(y2[i]-y1[i]); list[cnt].id=i; list[cnt].id1=0; list[cnt++].id2=i; f[i][cont[i]++]=cnt-1; adj[cnt-1][num[cnt-1]++]=0; adj[0][num[0]++]=cnt-1; ru=-v1*((x2[i]-x1[i])*(ya-y1[i])-(y2[i]-y1[i])*(xa-x1[i]))/v-(x1[i]-xa)*(x2[i]-x1[i])-(y1[i]-ya)*(y2[i]-y1[i]); ru/=((x2[i]-x1[i])*(x2[i]-x1[i])+(y2[i]-y1[i])*(y2[i]-y1[i])); list[cnt].x=x1[i]+ru*(x2[i]-x1[i]); list[cnt].y=y1[i]+ru*(y2[i]-y1[i]); list[cnt].id=i; list[cnt].id1=0; list[cnt++].id2=i; f[i][cont[i]++]=cnt-1; adj[cnt-1][num[cnt-1]++]=0; adj[0][num[0]++]=cnt-1; ru=v1*((x2[i]-x1[i])*(yb-y1[i])-(y2[i]-y1[i])*(xb-x1[i]))/v-(x1[i]-xb)*(x2[i]-x1[i])-(y1[i]-yb)*(y2[i]-y1[i]); ru/=((x2[i]-x1[i])*(x2[i]-x1[i])+(y2[i]-y1[i])*(y2[i]-y1[i])); list[cnt].x=x1[i]+ru*(x2[i]-x1[i]); list[cnt].y=y1[i]+ru*(y2[i]-y1[i]); list[cnt].id=i; list[cnt].id1=i; list[cnt++].id2=n+1; f[i][cont[i]++]=cnt-1; adj[cnt-1][num[cnt-1]++]=1; adj[1][num[1]++]=cnt-1; ru=-v1*((x2[i]-x1[i])*(yb-y1[i])-(y2[i]-y1[i])*(xb-x1[i]))/v-(x1[i]-xb)*(x2[i]-x1[i])-(y1[i]-yb)*(y2[i]-y1[i]); ru/=((x2[i]-x1[i])*(x2[i]-x1[i])+(y2[i]-y1[i])*(y2[i]-y1[i])); list[cnt].x=x1[i]+ru*(x2[i]-x1[i]); list[cnt].y=y1[i]+ru*(y2[i]-y1[i]); list[cnt].id=i; list[cnt].id1=i; list[cnt++].id2=n+1; f[i][cont[i]++]=cnt-1; adj[cnt-1][num[cnt-1]++]=1; adj[1][num[1]++]=cnt-1; } for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { double a1,b1,c1,a2,b2,c2; for(s=0;s<4;s++) { a1=v*((x2[i]-x1[i])*(x2[i]-x1[i])+(y2[i]-y1[i])*(y2[i]-y1[i])); if(s==0||s==2) { b1=-v*((x2[i]-x1[i])*(x2[j]-x1[j])+(y2[i]-y1[i])*(y2[j]-y1[j]))-v1*((x2[i]-x1[i])*(y2[j]-y1[j])-(y2[i]-y1[i])*(x2[j]-x1[j])); c1=v*((x2[i]-x1[i])*(x1[i]-x1[j])+(y2[i]-y1[i])*(y1[i]-y1[j]))-v1*((y2[i]-y1[i])*(x1[i]-x1[j])-(x2[i]-x1[i])*(y1[i]-y1[j])); } else { b1=-v*((x2[i]-x1[i])*(x2[j]-x1[j])+(y2[i]-y1[i])*(y2[j]-y1[j]))+v1*((x2[i]-x1[i])*(y2[j]-y1[j])-(y2[i]-y1[i])*(x2[j]-x1[j])); c1=v*((x2[i]-x1[i])*(x1[i]-x1[j])+(y2[i]-y1[i])*(y1[i]-y1[j]))+v1*((y2[i]-y1[i])*(x1[i]-x1[j])-(x2[i]-x1[i])*(y1[i]-y1[j])); } b2=-v*((x2[j]-x1[j])*(x2[j]-x1[j])+(y2[j]-y1[j])*(y2[j]-y1[j])); if(s==0||s==1) { a2=v*((x2[j]-x1[j])*(x2[i]-x1[i])+(y2[j]-y1[j])*(y2[i]-y1[i]))-v1*((x2[i]-x1[i])*(y2[j]-y1[j])-(y2[i]-y1[i])*(x2[j]-x1[j])); c2=v*((x2[j]-x1[j])*(x1[i]-x1[j])+(y2[j]-y1[j])*(y1[i]-y1[j]))-v1*((x1[i]-x1[j])*(y2[j]-y1[j])-(y1[i]-y1[j])*(x2[j]-x1[j])); } else { a2=v*((x2[j]-x1[j])*(x2[i]-x1[i])+(y2[j]-y1[j])*(y2[i]-y1[i]))+v1*((x2[i]-x1[i])*(y2[j]-y1[j])-(y2[i]-y1[i])*(x2[j]-x1[j])); c2=v*((x2[j]-x1[j])*(x1[i]-x1[j])+(y2[j]-y1[j])*(y1[i]-y1[j]))+v1*((x1[i]-x1[j])*(y2[j]-y1[j])-(y1[i]-y1[j])*(x2[j]-x1[j])); } ru1=(c2*b1-c1*b2)/(a1*b2-a2*b1); ru2=(c2*a1-c1*a2)/(b1*a2-b2*a1); list[cnt].x=x1[i]+ru1*(x2[i]-x1[i]); list[cnt].y=y1[i]+ru1*(y2[i]-y1[i]); list[cnt].id1=i; list[cnt].id2=j; list[cnt++].id=i; f[i][cont[i]++]=cnt-1; adj[cnt-1][num[cnt-1]++]=cnt; list[cnt].x=x1[j]+ru2*(x2[j]-x1[j]); list[cnt].y=y1[j]+ru2*(y2[j]-y1[j]); list[cnt].id1=i; list[cnt].id2=j; list[cnt++].id=j; f[j][cont[j]++]=cnt-1; adj[cnt-1][num[cnt-1]++]=cnt-2; } } // for(i=0;i<cnt;i++) // printf("list[%d]=(%f %f),id=%d\n",i,list[i].x,list[i].y,list[i].id); printf("%.6lf\n",dijkstra()); int u=1; ncnt=0; while(u!=0) { ans[ncnt++]=u; u=pa[u]; } printf("%d\n",ncnt); for(i=ncnt-1;i>=0;i--) { int val,id=ans[i]; if(i==ncnt-1||list[ans[i]].id!=list[ans[i+1]].id) val=0; else val=list[id].id; printf("%d %.6lf %.6lf\n",val,list[id].x+eps,list[id].y+eps); } //system("pause"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator