题目:
简单地求了一堆最短路而已。
1.有时候sqrt里要 * 1.0,不知何故;本题需要吗?
2.那个地方是 f [ col [ cur ] ],不是 f [ cnt ]!
*3.原来可以输入 .1%d 来限制输入一位数字,很方便!
#include#include #include #include #include #define ll long longusing namespace std;const int N=155;const double INF=1e9+5;int n,x[N],y[N],col[N],head[N],xnt,cnt;bool b[N][N],vis[N],in[N];double dis[N][N],c[N],fx[N],f[N],ans;struct Edge{ int next,to; double w; Edge(int n=0,int t=0,double w=0):next(n),to(t),w(w) {}}edge[N*N<<1];double calc(int i,int j){ return sqrt(1.0*(x[i]-x[j])*(x[i]-x[j])+1.0*(y[i]-y[j])*(y[i]-y[j]));}void add(int x,int y){ double tp=calc(x,y); edge[++xnt]=Edge(head[x],y,tp);head[x]=xnt; edge[++xnt]=Edge(head[y],x,tp);head[y]=xnt;}void dj(int cur,bool cs){ priority_queue ,vector >,greater > > q; memset(in,0,sizeof in); for(int i=1;i<=n;i++)c[i]=INF; c[cur]=0;q.push(make_pair(0,cur)); while(q.size()) { int k=q.top().second;q.pop(); while(in[k]&&q.size())k=q.top().second,q.pop(); if(in[k])break; in[k]=1;if(cs)col[k]=cnt;fx[cur]=max(fx[cur],c[k]); for(int i=head[k],v;i;i=edge[i].next) if(c[k]+edge[i].w