2020ICPC·小米 网络选拔赛第一场B题

注意:点的编号有0,first要初始化成-1,否则初始化0会冲突

#include<bits/stdc++.h>
using namespace std;
const int INF=1e18,N=1e6;
struct edge{
    
    
	int x1,y1,x2,y2;
}e[N];
struct point{
    
    
	int x,y;
}p[N];
point operator-(point a,point b){
    
    return (point){
    
    a.x-b.x,a.y-b.y};}
int operator *(const point &a,const point &b)
{
    
    
    int t=a.x*b.y-b.x*a.y;
    return t<0?-1:(t>0);
}
struct heap{
    
    
	double d;
	int u;
	bool operator<(const heap& temp) const{
    
    
		return d>temp.d;
	}
};
priority_queue<heap>Q;
bool line(point a1,point a2,point b1,point b2){
    
    
	return((a2-a1)*(b1-a1))*((a2-a1)*(b2-a1))<0&&((b2-b1)*(a1-b1))*((b2-b1)*(a2-b1))<0;
}
int n,m,k,first[N],qnext[N],v[N],esum=0;
double w[N],d[N];
bool vis[N];
void add(int a,int b,double c){
    
    
	v[esum]=b;
	w[esum]=c;
	qnext[esum]=first[a];
	first[a]=esum++;
}
int main(){
    
    
	memset(first,-1,sizeof(first));
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++){
    
    
		cin>>e[i].x1>>e[i].y1>>e[i].x2>>e[i].y2;
		p[i*2-1].x=e[i].x1,p[i*2-1].y=e[i].y1;
		p[i*2].x=e[i].x2,p[i*2].y=e[i].y2;
	}
	cin>>p[0].x>>p[0].y>>p[2*k+1].x>>p[2*k+1].y;
	bool flag;
	for(int i=0;i<2*k+1;i++)
		for(int j=i+1;j<=2*k+1;j++){
    
    
			flag=1;
			for(int q=1;q<=k;q++)
				if(line(p[i],p[j],(point){
    
    e[q].x1,e[q].y1},(point){
    
    e[q].x2,e[q].y2})){
    
    
					flag=0;
					break;
				}
			if(flag){
    
    
				double dis=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
				v[esum]=j;
				w[esum]=dis;
				qnext[esum]=first[i];
				first[i]=esum++;
				v[esum]=i;
				w[esum]=dis;
				qnext[esum]=first[j];
				first[j]=esum++;
			}
		}
	for(int i=1;i<=2*k+1;i++) d[i]=INF;
	Q.push((heap){
    
    0,0});
	while(!Q.empty()){
    
    
		heap x=Q.top();
		Q.pop();
		int u=x.u;
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=first[u];~i;i=qnext[i])
			if(d[v[i]]>d[u]+w[i]){
    
    
				d[v[i]]=d[u]+w[i];
				Q.push((heap){
    
    d[v[i]],v[i]});
			}
	}
	printf("%.4f",d[k*2+1]);
	return 0; 
} 

猜你喜欢

转载自blog.csdn.net/u013455437/article/details/109632582