题意:在该地区选择一个中心位置,使得目标位置距离中心位置最大距离为最小值,输出最小值与对应的中心位置的序号
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2377
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1912
思路:以目标位置作为源点进行单元最短路径搜索(SPFA,dijkstra),将所有可能的最长距离保存在path数组中,选择path中最小的值进行输出。
注意点:无
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
11706915 | 2014-09-23 08:37:48 | Accepted | 2377 | 328MS | 1464K | 2050 B | G++ | luminous11 |
Run ID | Submit Time | Judge Status | Problem ID | Language | Run Time(ms) | Run Memory(KB) | User Name |
3778807 | 2014-09-23 08:31:44 | Accepted | 2913 | C++0x | 130 | 1320 | luminus |
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int m, n;
int adj[10005][25];
int len[10005];
int path[10005];
void SPFA ( int num )
{
int tmp[10005];
bool vis[10005];
memset ( tmp, 0x3f3f3f3f, sizeof ( tmp ) );
memset ( vis, false, sizeof ( vis ) );
queue<int> p;
tmp[num] = 1;
p.push ( num );
int k;
while ( ! p.empty() )
{
k = p.front(); p.pop();
for ( int i = 0; i < len[k]; i ++ )
{
if ( tmp[adj[k][i]] > tmp[k] + 1 )
{
tmp[adj[k][i]] = tmp[k] + 1;
//vis[adj[k][i]] = true;
p.push ( adj[k][i] );
}
}
}
for ( int i = 0; i < 10005; i ++ )
{
if ( tmp[i] >= path[i] )
{
path[i] = tmp[i];
}
}
}
int main()
{
ios_base::sync_with_stdio ( false );
int ncase;
cin >> ncase;
while ( ncase -- )
{
cin >> m >> n;
memset ( path, 0, sizeof ( path ) );
memset ( len, 0, sizeof ( len ) );
memset ( adj, 0x3f3f3f3f, sizeof ( adj ) );
for ( int i = 0; i < m; i ++ )
{
int num;
cin >> num;
cin >> len[num];
for ( int j = 0; j < len[num]; j ++ )
{
cin >> adj[num][j];
}
}
for ( int i = 0; i < n; i ++ )
{
int k;
cin >> k;
int num;
for ( int j = 0; j < k; j ++ )
{
cin >> num;
SPFA ( num );
}
}
int min_num = 1000000;
int k;
for ( int i = 0; i < 10005; i ++ )
{
if ( path[i] < min_num && path[i] )
{
min_num = path[i];
k = i;
}
}
cout << min_num << ' ' << k << endl;
}
return 0;
}