GPLT L3-005. 垃圾箱分布【最短路Dijkstra】

题目:垃圾箱分布

题意:选一垃圾桶的位置到所有居民点距离最佳,“到所有居民点的最短距离最长的地方”意思就是将每个垃圾桶位置的到居民点最短的路中筛选最长的那个的垃圾桶作为结果~

思路:将所有垃圾桶的位置利用Dijkstra依次搜出到各个居名点的最短路,然后加入到一个结构体数组中,注意当超出限制范围无需加入,最后按要求排序即可。

注意输入时需要用字符串处理,将G的加上n,即垃圾桶的编号为n以后的数,注意编号不只是个位数~

代码:

#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 1020;
const int inf = 999999999;
int g[maxn][maxn],dis[maxn],visit[maxn];
int n,m,k,ds;
struct bag{
    int id,mindis;
    double avg;
}ans[15];
bool cmp(bag a,bag b){
    if(a.mindis == b.mindis){
        if(a.avg == b.avg) return a.id < b.id;
        return a.avg < b.avg;
    }
    return a.mindis > b.mindis;//最短距离最长!
}
void init(){
    for(int i=1;i<=n+m;i++)
        for(int j=1;j<=n+m;j++)
            if(i == j) g[i][j] = 0;else g[i][j] = inf;
}
void Dijkstra(int start){
    for(int i=1;i<=n+m;i++){
        dis[i] = g[start][i];
    }
    visit[start] = 1;
    for(int i=1;i<=n+m;i++){
        int minn = inf,record;
        for(int j=1;j<=n+m;j++)
            if(dis[j] < minn && !visit[j]){minn = dis[j];record = j;}
        visit[record] = 1;
        for(int j=1;j<=n+m;j++){
            if(!visit[j] && dis[record] + g[record][j] < dis[j]){dis[j] = dis[record] + g[record][j];}
        }
    }
}
int trans(char a[],int start){

    int sum = 0;
    for(int i=start;a[i]!='\0';i++){sum*=10;sum += a[i] - '0';}
    return sum;
}
int main()
{
    char u[10],v[10];
    int dist;
    while(scanf("%d%d%d%d",&n,&m,&k,&ds)!=EOF){
        init();
        for(int i=0;i ds) {flag = 1;break;}//超出限制范围
                sum += dis[j];
                msd = min(msd,dis[j]);//求垃圾桶到所有居民点最小距离
            }
            if(flag) continue;
            ans[cnt].id = i-n;
            ans[cnt].avg = (double)sum/n;
            ans[cnt++].mindis = msd;
        }
        sort(ans,ans+cnt,cmp);
        if(cnt > 0){
            printf("G%d\n%.1lf %.1lf\n",ans[0].id,(double)ans[0].mindis,ans[0].avg);
        }else printf("No Solution\n");
    }
    return 0;
}


你可能感兴趣的:(解题思路,PAT,最短路径,GPLT,天梯赛)