Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define filer() freopen("in.txt","r",stdin)
- #define filew() freopen("out.txt","w",stdout)
- #define SET(a, x) memset((a), (x), sizeof(a))
- #define i64 long long
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<math.h>
- #include<algorithm>
- #include<queue>
- #include<stack>
- #include<vector>
- #include <map>
- #define INF 1<<29
- double EPS=1e-7;
- using namespace std;
- struct NODE
- {
- int r,c;
- double d,sum;
- };
- NODE PQ[2600];
- struct POINT
- {
- double x;
- double y;
- };
- bool vst[55][55];
- double W[55][55];
- double D[55][55];
- double dist[55][55];
- POINT node[55];
- double compute(int u,int v)
- {
- //if(dist[u][v]!=0)return dist[u][v];
- //if(dist[v][u]!=0)return dist[v][u];
- double a,b,c;
- a=(node[u].x-node[v].x)*(node[u].x-node[v].x);
- b=(node[u].y-node[v].y)*(node[u].y-node[v].y);
- c=a+b;
- c=sqrt(c);
- return c;
- }
- bool cmp(NODE a,NODE b)
- {
- if(fabs(a.sum-b.sum)<EPS && fabs(a.d-b.d)<EPS && a.r==b.r)return a.c<b.c;
- if(fabs(a.sum-b.sum)<EPS && fabs(a.d-b.d)<EPS)return a.r<b.r;
- if(fabs(a.sum-b.sum)<EPS)return (a.d-b.d)<EPS;
- return (a.sum-b.sum)>EPS;
- }
- /*bool cmp(NODE a,NODE b)
- {
- //if(a.sum==b.sum && a.d==b.d && a.r==b.r)return a.c<b.c;
- if(fabs(a.sum-b.sum)<EPS && fabs(a.d-b.d)<EPS)return (a.r+a.c)<(b.r+b.c);
- if(fabs(a.sum-b.sum)<EPS)return a.d<b.d;
- return a.sum>b.sum;
- }*/
- /*bool cmp(NODE a,NODE b)
- {
- if(a.sum==b.sum && a.d==b.d && a.r==b.r)return a.c<b.c;
- if(a.sum==b.sum && a.d==b.d)return a.r<b.r;
- if(a.sum==b.sum)return a.d<b.d;
- return a.sum>b.sum;
- }*/
- int main()
- {
- //filer();
- int T,cas=0,i,j,u,v,k,N,M;
- POINT A;
- while(scanf("%d%d",&N,&M)==2)
- {
- if(N==0 && M==0)break;
- // node.clear();
- for(i=0;i<=51;i++)
- {
- for(j=0;j<=51;j++)
- {
- vst[i][j]=0;
- if(i!=j){
- W[i][j]=INF;
- D[i][j]=INF;}
- else
- {
- W[i][j]=0;
- D[i][j]=0;
- }
- dist[i][j]=0;
- }
- }
- for(i=1;i<=N;i++)
- {
- scanf("%lf%lf",&A.x,&A.y);
- node[i]=A;
- }
- for(i=1;i<=N;i++)
- {
- for(j=1;j<=N;j++)dist[i][j]=compute(i,j);
- }
- for(i=1;i<=M;i++)
- {
- scanf("%d%d",&u,&v);
- W[u][v]=dist[u][v];
- W[v][u]=W[u][v];
- D[u][v]=W[u][v];
- D[v][u]=W[u][v];
- vst[u][v]=1;
- vst[v][u]=1;
- }
- for(k=1;k<=N;k++)
- {
- for(i=1;i<=N;i++)
- {
- for(j=1;j<=N;j++)
- {
- D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
- }
- }
- }
- NODE S;
- k=0;
- for(u=1;u<=N;u++)
- {
- for(v=1;v<=N;v++)
- {
- if(!vst[u][v] )
- {
- S.r=u;
- S.c=v;
- S.d=dist[i][j];
- S.sum=0;
- for(i=1;i<=N;i++)
- {
- for(j=1;j<=N;j++)
- {
- double z=min(D[i][j],D[i][u]+dist[u][v]+D[v][j]);
- z=min(z,D[i][v]+dist[v][u]+D[u][j]);
- S.sum+=(D[i][j]-z);
- }
- }
- PQ[k++]=S;
- }
- }
- }
- sort(PQ,PQ+k,cmp);
- if(PQ[0].sum<=1.0)printf("No road required\n");
- else printf("%d %d\n",PQ[0].r,PQ[0].c);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement