洛谷1522牛的旅行
生活随笔
收集整理的這篇文章主要介紹了
洛谷1522牛的旅行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:https://www.luogu.org/problemnew/show/P1522
簡單地求了一堆最短路而已。
1.有時候sqrt里要 * 1.0,不知何故;本題需要嗎?
2.那個地方是 f [ col [ cur ] ],不是 f [ cnt ]!
*3.原來可以輸入 .1%d 來限制輸入一位數字,很方便!
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #define ll long long using 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<pair<double,int>,vector<pair<double,int> >,greater<pair<double,int> > > 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<c[v=edge[i].to]){c[v]=c[k]+edge[i].w;q.push(make_pair(c[v],v));}}f[col[cur]]=max(f[col[cur]],fx[cur]);//不是f[cnt] } int main() {scanf("%d",&n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=INF;for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]);bool tp=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){scanf("%1d",&tp);if(tp)add(i,j);// }for(int i=1;i<=n;i++)if(!vis[i]){int cs=0;vis[i]=1;if(!col[i])cnt++,cs=1;dj(i,cs);}ans=INF;for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)if(col[i]!=col[j])ans=min(ans,max(fx[i]+fx[j]+calc(i,j),max(f[col[i]],f[col[j]])));printf("%.6lf",ans);return 0; }?
轉載于:https://www.cnblogs.com/Narh/p/8954470.html
總結
以上是生活随笔為你收集整理的洛谷1522牛的旅行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 负载均衡服务器nginx详细安装教程及网
- 下一篇: CentOS安装sshd服务