| input | output |
|---|---|
7 Isenbaev Oparin Toropov Ayzenshteyn Oparin Samsonov Ayzenshteyn Chevdar Samsonov Fominykh Isenbaev Oparin Dublennykh Fominykh Ivankov Burmistrov Dublennykh Kurpilyanskiy Cormen Leiserson Rivest |
Ayzenshteyn 2 Burmistrov 3 Chevdar 3 Cormen undefined Dublennykh 2 Fominykh 1 Isenbaev 0 Ivankov 2 Kurpilyanskiy 3 Leiserson undefined Oparin 1 Rivest undefined Samsonov 2 Toropov 1 |
题意:给出n个3人小组,Isenbaev被编号为0,他的队友编号为1,他队友的队友被编号为2。。。以此类推,如果没有办法通过关系联系到Isenbaev,则输出“undefined”,其他的输出编号。
解析:先将所有的人用map映射出一个编号,这里就利用了map可以自动按字典序排序的特点,把所有出现过的字符串直接放到map里,遍历的时候就是有字典序的了。然后就是以编号为顶点建无向图了,各组员之间的距离为1,这样用Dijkstra就可以了求解最短距离了。当然BFS也可以搜出最短路径长度。
AC代码:
#include <cstdio>
#include <string>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
#define INF 1e7
const int maxn = 302;
int g[maxn][maxn], d[maxn];
string a[maxn][3];
map<string, int> m;
bool used[maxn];
void dijkstra(int s, int V){ //Dijkstra算法
fill(d, d + V, INF);
fill(used, used + V, false);
d[s] = 0;
while(true){
int v = -1;
for(int u=0; u<V; u++){
if(!used[u] && (v == -1 || d[u] < d[v])) v = u;
}
if(v == -1) break;
used[v] = true;
for(int u=0; u<V; u++){
d[u] = min(d[u], d[v] + g[v][u]);
}
}
}
int main(){
#ifdef sxk
freopen("in.txt", "r", stdin);
#endif //sxk
int n;
while(scanf("%d", &n)==1){
for(int i=0; i<n; i++){
cin >> a[i][0] >> a[i][1] >> a[i][2];
m[ a[i][0] ] = 0; m[ a[i][1] ] = 0; m[ a[i][2] ] = 0; //把字符串放到map里
}
int num = 0;
map<string, int>::iterator it;
for(it = m.begin(); it!=m.end(); it++){
it->second = ++num; //给个字符串编号
}
for(int i=0; i<maxn; i++)
for(int j=0; j<maxn; j++) g[i][j] = INF;
for(int i=0; i<n; i++){ //初始化组员之间距离
int f1 = m.find(a[i][0])->second, f2 = m.find(a[i][1])->second, f3 = m.find(a[i][2])->second;
g[f1][f2] = g[f2][f3] = g[f1][f3] = 1;
g[f2][f1] = g[f3][f2] = g[f3][f1] = 1;
}
int len = m.size();
it = m.find("Isenbaev");
if(it == m.end()){
for(it=m.begin(); it!=m.end(); it++) cout<<it->first<<" "<<"undefined"<<endl;
continue;
}
dijkstra(it->second, len + 1);
for(it=m.begin(); it!=m.end(); it++){
cout<<it->first<<" ";
if(d[it->second] == INF) puts("undefined");
else cout<<d[it->second]<<endl;
}
}
return 0;
}
URAL 1837. Isenbaev's Number (map + Dijkstra || BFS)
原文地址:http://blog.csdn.net/u013446688/article/details/44336773