大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的范围内。
现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解。如果这样的解还是不唯一,则输出编号最小的地点。
输入格式:
输入第一行给出4个正整数:N(≤)是居民点的个数;M(≤)是垃圾箱候选地点的个数;K(≤)是居民点和垃圾箱候选地点之间的道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从1到N编号,所有的垃圾箱候选地点从1到GM编号。
随后K行,每行按下列格式描述一条道路:
P1 P2 Dist
其中P1
和P2
是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist
是道路的长度,是一个正整数。
输出格式:
首先在第一行输出最佳候选地点的编号。然后在第二行输出该地点到所有居民点的最小距离和平均距离。数字间以空格分隔,保留小数点后1位。如果解不存在,则输出No Solution
。
输入样例1:
4 3 11 5
1 2 2
1 4 2
1 G1 4
1 G2 3
2 3 2
2 G2 1
3 4 2
3 G3 2
4 G1 3
G2 G1 1
G3 G2 2
输出样例1:
G1
2.0 3.3
输入样例2:
2 1 2 10
1 G1 9
2 G1 20
输出样例2:
No Solution
看错题目了导致比赛的时候死活和样例对不上QAQ
还有就是 字符转数组居然打反了!!!fuck 导致最后一个点一直wa 打反了前面四个点居然还能wa
其他没什么好说了 dijkstra模板题
判断有点麻烦

#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 1055 #define inf 0x3f3f3f3f int n,m; int mp[N][N]; int dis[N]; int vis[N]; void dijkstra(int s) { memset(vis,0,sizeof vis); for(int i=1;i<=n;i++) dis[i]=mp[s][i]; dis[s]=0; //vis[s]=1; for(int i=1;i<=n;i++) { int minn=inf,u=-1; for(int j=1;j<=n;j++) if(!vis[j]&&minn>dis[j]) minn=dis[u=j]; if(u==-1)return; vis[u]=1; for(int j=1;j<=n;j++) { if(dis[j]>dis[u]+mp[u][j]) { dis[j]=dis[u]+mp[u][j]; } } } } int main() { int a,b,q,d; RIII(a,b,q);RI(d); n=a+b; rep(i,1,n) rep(j,1,n) if(i==j)mp[i][j]=0; else mp[i][j]=inf; char s1[10],s2[10]; int c; while(q--) { int fi,se; RS(s1); RS(s2); RI(c); if(s1[0]=='G') { if(strlen(s1)==3) fi=a+10+s1[2]-'0'; else fi=a+s1[1]-'0'; } else { int len=strlen(s1); int val=0; for(int i=0;i<len;i++)//一开始还弄反了!fuck val=10*val+s1[i]-'0'; fi=val; } if(s2[0]=='G') { if(strlen(s2)==3) se=a+10+s2[2]-'0'; else se=a+s2[1]-'0'; } else { int len=strlen(s2); int val=0; for(int i=0;i<len;i++) val=10*val+s2[i]-'0'; se=val; } if(c<mp[fi][se]) mp[fi][se]=mp[se][fi]=c; } double sum; double PJ=inf; double mind=-1; int num=-1; int flag=0; rep(i,a+1,n) { sum=0; int ok=1; dijkstra(i); int minn=inf; rep(j,1,a) { if(dis[j]>d){ok=0;break;} sum+=dis[j]; minn=min(dis[j],minn); } if(ok==1) { flag=1; sum/=(a*1.0); if(minn>mind) { num=i; mind=minn; PJ=sum; } else if(minn==mind&&sum<PJ) { num=i; PJ=sum; } } } if(flag) printf("G%d %0.1lf %0.1lf",num-a,mind,PJ); else printf("No Solution"); return 0; }