| ||||||||||
| 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 | |||||||||
坑爹呀,一通乱搞竟然过了。。还不明白这样写为什么正确,附代码Source Code
Problem: 1534 User: JiaJunpeng
Memory: 272K Time: 188MS
Language: C++ Result: Accepted
Source Code
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<stdio.h>
#include<cstring>
using namespace std;
double ans;
int n,k,p,d,cnt,adj[51][91],num[51],to[150];
bool visit[51];
struct edge
{
int id1,id2;
double w;
bool operator <(const edge &temp)const
{
return w<temp.w;
}
};
edge edges[5000];
struct airport
{
double x,y;
};
airport airports[60];
struct tower
{
double x,y;
};
tower towers[60];
struct plane
{
double h,m,s;
int f,t;
};
plane planes[100];
double dist(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool dfs(int id)
{
int i,j,s,q,ip;
for(i=0;i<num[id];i++)
{
ip=adj[id][i];
if(to[ip]==ip)
{
to[id]=ip;
to[ip]=id;
return true;
}
else
{
if(!visit[to[ip]])
{
visit[to[ip]]=true;
if(dfs(to[ip]))
{
to[id]=ip;
to[ip]=id;
return true;
}
}
}
}
return false;
}
double kk()
{
int i,j,s,q,temp;
double res=1000000000;
for(i=0;i<cnt;i++)
{
for(j=0;j<k;j++)
num[j]=visit[j]=0;
for(j=0;j<k+p;j++)
to[j]=j;
temp=0;
for(j=i+1;j<cnt;j++)
{
int id1=edges[j].id1,id2=edges[j].id2;
if(id1==edges[i].id1||id2==edges[i].id2)
continue;
adj[id1][num[id1]++]=id2;
visit[id1]=true;
temp+=dfs(id1);
if(temp>=d-1)
break;
}
if(j<cnt)
{
if(res>edges[j].w-edges[i].w)
res=edges[j].w-edges[i].w;
}
else
break;
}
return res;
}
int main()
{
int i,j,s,q,id;
while(scanf("%d%d%d%d",&n,&k,&p,&d)&&n+k+p+d)
{
for(i=0;i<n;i++)
scanf("%lf%lf",&airports[i].x,&airports[i].y);
for(i=0;i<k;i++)
scanf("%lf%lf",&towers[i].x,&towers[i].y);
for(i=0;i<p;i++)
{
scanf("%lf%lf%d%d%lf",&planes[i].h,&planes[i].m,&planes[i].f,&planes[i].t,&planes[i].s);
planes[i].f--;
}
if(d>min(k,p))
{
puts("Impossible!");
continue;
}
if(d<=1)
{
printf("0:0\n");
continue;
}
cnt=0;
for(i=0;i<k;i++)
for(j=0;j<p;j++)
{
edges[cnt].id1=i;
edges[cnt].id2=j+k;
id=planes[j].f;
edges[cnt].w=dist(airports[id].x,airports[id].y,towers[i].x,towers[i].y)/planes[j].s;
edges[cnt].w+=(planes[j].h*60.00+planes[j].m)*60.00;
edges[cnt].w/=60.00;
cnt++;
}
sort(edges,edges+cnt);
ans=kk();
if(ans<1000000000)
printf("%d:%d\n",((int)(ans+0.5))/60,((int)(ans+0.5))%60);
else
puts("Impossible!");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator