L3-005. 垃圾箱分布

来源:互联网 发布:手机移动数据怎么关闭 编辑:程序博客网 时间:2024/05/14 02:18


大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的范围内。

现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解。如果这样的解还是不唯一,则输出编号最小的地点。

输入格式:

输入第一行给出4个正整数:N(<= 103)是居民点的个数;M(<= 10)是垃圾箱候选地点的个数;K(<= 104)是居民点和垃圾箱候选地点之间的道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从1到N编号,所有的垃圾箱候选地点从G1到GM编号。

随后K行,每行按下列格式描述一条道路:
P1 P2 Dist
其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。

输出格式:

首先在第一行输出最佳候选地点的编号。然后在第二行输出该地点到所有居民点的最小距离和平均距离。数字间以空格分隔,保留小数点后1位。如果解不存在,则输出“No Solution”。

输入样例1:
4 3 11 51 2 21 4 21 G1 41 G2 32 3 22 G2 13 4 23 G3 24 G1 3G2 G1 1G3 G2 2
输出样例1:
G12.0 3.3
输入样例2:
2 1 2 101 G1 92 G1 20
输出样例2:
No Solution

思路分析:这道题和甲级1072题目是一样的。题目本身不难,就是题意不好懂。(尤其看1072英文题目的时候......)。思路就是Dijkstra + 第二标尺判断。


#include <iostream>#include <algorithm>#define MAX 1000 + 11#define INF 0x3fffffffusing namespace std;// 输入int N, M, K, D;int MGraph[MAX][MAX];// Dijkstraint dist[MAX];int visit[MAX];// 第二标尺int minDist = -1;int minIndex = -1;int minSum = INF;void initMGraph() {    for( int i = 0; i < MAX; i++ ) {        for( int j = 0; j < MAX; j++ ) {            if( i == j ) MGraph[i][j] = 0;            else MGraph[i][j] = INF;        }    }}int stringToInt( string str ) {    int index = 0;    int size = str.size();    if( str[0] == 'G' ) {        for( int i = 1; i < size; i++ ) {            index = index * 10 + ( str[i] - '0' );        }        index += N;    }    else {        for( int i = 0; i < size; i++ ) {            index = index * 10 + ( str[i] - '0' );        }    }    return index;}void Dijkstra( int s ) {    fill( dist, dist + MAX, INF );    fill( visit, visit + MAX, 0 );    dist[s] = 0;    for( int i = 1; i <= N + M; i++ ) {        int u = -1, MIN = INF;        for( int j = 1; j <= N + M; j++ ) {            if( !visit[j] && dist[j] < MIN ) {                MIN = dist[j];                u = j;            }        }        if( u == -1 ) return;        visit[u] = 1;        for( int v = 1; v <= N + M; v++ ) {            if( !visit[v] && MGraph[u][v] != 0 && MGraph[u][v] != INF ) {                if( dist[v] > dist[u] + MGraph[u][v] ) {                    dist[v] = dist[u] + MGraph[u][v];                }            }        }    }}int main() {    //freopen( "123.txt", "r", stdin );    initMGraph();    scanf( "%d%d%d%d", &N, &M, &K, &D );    string a, b;    int l;    for( int i = 0; i < K; i++ ) {        cin >> a >> b >> l;        int aId = stringToInt( a );        int bId = stringToInt( b );        MGraph[aId][bId] = l;        MGraph[bId][aId] = l;    }    for( int i = N + 1; i <= N + M; i++ ) {        Dijkstra( i );        sort( dist + 1, dist + 1 + N );        int curMin = dist[1];        int curMax = dist[N];        int curSum = 0;        if( curMax > D ) continue;        for( int j = 1; j <= N; j++ ) {            curSum += dist[j];        }        if( curMin > minDist ) {            minDist = curMin;            minIndex = i;            minSum = curSum;        }        else if( curMin == minDist && curSum < minSum ) {            minIndex = i;            minSum = curSum;        }    }    if( minIndex == -1 ) {        printf( "No Solution\n" );    }    else {        printf( "G%d\n", minIndex - N );        printf( "%.1lf %.1lf\n", (double)minDist, (double)minSum / N );    }    return 0;}


0 0
原创粉丝点击