題目:Erdos是個偉大的數學家(不知道的話,自行百度吧),他署名的論文有1000多份,
於是數學及澳門定義了一個Erdos數的概念,直接和Erdos發表論文的記為1,
和Erdos為1的人共同發表論文的人記為2,依次類推,現在已知一些論文和作者,
求對應的Erdos數。
分析:圖論,最短路。
首先,按照要求,取出所有的人名,利用map映射到唯一的ID;
然後,同一偏論文的作者,相互連邊,利用bfs求最短路;
最后,對每個查詢的節點取深度信息即可。
說明:圖大概有10000個點,1000000條邊,數值開小會RE或者SF。
#include <algorithm> #include <iostream> #include <cstring> #include <string> #include <queue> #include <map> using namespace std; //邻接表 typedef struct _linklist { int point; _linklist* next; }linklist ; linklist* link_head[10001]; linklist link_node[1000001]; int link_size; void link_initial() { memset(link_head, 0, sizeof(link_head)); memset(link_node, 0, sizeof(link_node)); link_size = 0; } void link_add(int a, int b) { link_node[link_size].point = b; link_node[link_size].next = link_head[a]; link_head[a] = &link_node[link_size ++]; } //邻接表 end int deep[10001]; void bfs(int s, int n) { for (int i = 0; i < n; ++ i) deep[i] = -1; deep[s] = 0; queue<int>Q; Q.push(s); while (!Q.empty()) { int now = Q.front(); Q.pop(); for (linklist *p = link_head[now]; p; p = p->next) { if (deep[p->point] == -1) { deep[p->point] = deep[now] + 1; Q.push(p->point); } } } } string buf, name; int save[10001]; int main() { int T,n,m; cin >> T; for (int t = 1; t <= T; ++ t) { cin >> n >> m; cin.ignore(); int count = 0; map <string, int>Map; link_initial(); for (int i = 0; i < n; ++ i) { getline(cin, buf); int strs = 0, stre = 0, size = 0; while (buf[strs] != ':') { stre = strs; while (buf[stre] != ',' && buf[stre] != ':' || buf[stre-1] != '.') ++ stre; string str = buf.substr(strs, stre-strs); if (!Map.count(str)) Map.insert(pair<string, int>(str, count ++)); save[size ++] = Map[str]; strs = stre; while (buf[strs] < 'A' || buf[strs] > 'Z') if (buf[strs] != ':') ++ strs; else break; } for (int j = 0; j < size; ++ j) for (int k = 0; k < j; ++ k) if (j != k) { link_add(save[j], save[k]); link_add(save[k], save[j]); } } bfs(Map["Erdos, P."], count); cout << "Scenario " << t << endl; for (int i = 0; i < m; ++ i) { getline(cin, name); if (!Map.count(name) || deep[Map[name]] == -1) cout << name << " infinity" << endl; else cout << name << " " << deep[Map[name]] << endl; } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-07 06:30:03