/* Name:poj 1391 Erdos Numbers Author: Unimen Date: 4/05/2011 16:51 Description:SPFA 最短路径 */ /* 解题报告:SPFA最短路径 1、难点在于建图 分析:1、先把每个作者编号,便于建图,我用map实现 2、本题图的数据量有点大,可以考虑用vector实现,注释中vector<int> database就是存储图的数据结构 3、每读入一行数据(每篇论文)就进行一次建图,见注释中 */ #include <iostream> #include <queue> #include <cstring> #include <string> #include <cstdio> #include <vector> #include <map> using namespace std; int p, n, aucount; //从0开始编号 map<string, int> authorid; //将作者转换为数字id vector<int> database[10010]; //存放作者之间关系的邻接表 int page[10010]; //存放读入的每篇论文的作者 int author[10010]; //存放number void spfa(int Erdos) { int i; int j; for(i=0; i<aucount; ++i) { author[i] = 1000000; } queue<int> que; que.push(Erdos); author[Erdos] = 0; while(!que.empty()) { int x = que.front(); que.pop(); for(i=0; i<aucount; ++i) { for(j=0; j<database[i].size(); ++j) { if(database[i][j]==x && author[i]>author[x]+1) { author[i] = author[x] + 1; que.push(i); } } } } } int main() { int i, j, q; char szName[200]; string szFullName; bool bTitle; int nCase = 0; int countpage; while(scanf("%d%d", &p,&n)!=EOF && n && p) { aucount = 0; for(i=1; i<=p; ++i) { bTitle = false; countpage = 0; while(!bTitle) { szFullName = ""; scanf("%s", szName); szName[strlen(szName) - 1] = ' '; szFullName = szName; //重写 scanf("%s", szName); if(szName[strlen(szName)-1] == '.') { bTitle = true; } else if(szName[strlen(szName)-1] == ':') { bTitle = true; szName[strlen(szName)-1] = '/0'; } else { szName[strlen(szName)-1] = '/0'; } szFullName += szName; if(authorid.count(szFullName) == 0) authorid[szFullName] = aucount++; if(bTitle) gets(szName); page[countpage++] = authorid[szFullName]; } //构造作者关系的邻接矩阵 for(j=0; j<countpage; ++j) { for(q=0; q<countpage; ++q) { if(j != q) database[page[j]].push_back(page[q]); } } } spfa(authorid["Erdos P."]); for(i=1; i<=n; ++i) { scanf("%s", szName); if(1 == i) cout<<"Database #"<<++nCase<<endl; cout<<szName<<" "; szName[strlen(szName) - 1] = ' '; szFullName = szName; scanf("%s", szName); szFullName += szName; cout<<szName<<": "; if(authorid.count(szFullName) == 0) printf("infinity/n"); else if(1000000 == author[authorid[szFullName]]) printf("infinity/n"); else printf("%d/n", author[authorid[szFullName]]); } //每个case完打印一个 空行 cout<<endl; //部分数据清零 authorid.clear(); for(j=0; j<aucount; j++) database[j].clear(); } return 0; }