UVa 10044 - Erdos Numbers

來源:互聯網
上載者:User

標籤:

題目: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.