注意:点的编号有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;
}