標籤:
題目: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;elsecout << name << " " << deep[Map[name]] << endl;}} return 0;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
UVa 10044 - Erdos Numbers