UVa OJ 10044 - Erdos Numbers

来源:互联网 发布:微信矩阵营销 编辑:程序博客网 时间:2024/05/17 03:11

这个题目我做的方法比较奇怪,我也说不上是什么算法,就当是深度优先吧。

对于每个人名都记录下他在哪一行输入出现过,每次这个人的erdos数值增加,就更新他出现的行数的其他人的erdos数值。然后递归调用。

很多人认为输入很难读取。我是这么处理的,搜索".,"直到搜不到为止,每搜索到一组就是一个人名。最后搜索".:",搜索到的下标到最后出现".,"的下标之间就是最后一个人名。

1043111010044Erdos NumbersAcceptedC++0.4642012-08-04 04:50:44速度还行,可以接受。

#include <vector>#include <iostream>#include <string>#include <cstdlib>using namespace std;struct erdoNumber{string name;int value;vector<int>levels;};vector<erdoNumber> data;vector<vector<int> > pointers;const string ERDOS = "Erdos, P.";const int MAX = 10000000;int lvValue = 0;int searcher(const string &a,int flag,int assignV=0){ // 1:返回value 2:返回idx  3:赋值for (int i=0;i<data.size();i++){if (data.at(i).name==a){if (flag==1)return data.at(i).value;else if (flag==2)return i;else if (flag==3){data.at(i).value = assignV;return 1;}}}if (flag==2)return -1; //not foundreturn MAX;}void assign(int idx){ //递归int curVal = data[idx].value;for (int j=0;j<data[idx].levels.size();j++){int p = data[idx].levels.at(j); //找到对应的levelfor (int i=0;i<pointers.at(p).size();i++){ //遍历pointer里面该level所有的值int place = pointers.at(p).at(i);int theVal = data[place].value;if (curVal+1<theVal){ //若更小data[place].value = curVal+1; //赋予新值assign(place); //调用自己,更新所有值}}}}void append(const string &a){//10000000erdoNumber xxx;xxx.name = a;xxx.value = MAX;xxx.levels.push_back(lvValue);data.push_back(xxx);}void processStr(const string &a){vector<string> names;int startIdx = 0;while (a.find(".,",startIdx)!=string::npos){int endIdx = a.find(".,",startIdx)+1;names.push_back(a.substr(startIdx,endIdx-startIdx));//cout<<personName<<endl;startIdx = endIdx+2;}int lastIdx = a.find(".:")+1;names.push_back(a.substr(startIdx,lastIdx-startIdx));//cout<<personName<<endl;int min = MAX; //找到该组最小值for (int i=0;i<names.size();i++){int idx = searcher(names.at(i),2);if (idx==-1){ //若没有找到append(names.at(i)); //添加idx = data.size()-1; //最后一个即为idx}else{ //若找到则添加此值data.at(idx).levels.push_back(lvValue);}pointers.at(lvValue).push_back(idx); //记录该lv此值在data中的位置int x = data.at(idx).value;if (x<min&&x>=0) //小于最小值且大于等于0,避免不合格的lvValuemin =x; } //给所有人赋值if (min<MAX){ //只当有联系的时候for (int i=0;i<names.size();i++){int idx = searcher(names.at(i),2);int v = data[idx].value;if (v>min+1){ //只给需要的人赋值data[idx].value=min+1;assign(idx);}//change here/*else if (v<0){ //若是负数int lv = v;valReplacer(lv,min+1+1); //不忘了当年一起捡破烂的兄弟,不过+1}*/}}}int main(){int sc;cin>> sc;for (int s=1; s<=sc;s++){data.clear();pointers.clear();erdoNumber erdos;erdos.name = ERDOS;erdos.value = 0;data.push_back(erdos);int P;int N;cin>>P>>N;vector<string> names;cin.get();//read newlinefor (int i=0;i<P;i++){lvValue = i;vector<int> pidx;pointers.push_back(pidx);string tmp;getline(cin,tmp);processStr(tmp);}vector<string>output;for (int i=0;i<N;i++){string tmp;getline(cin,tmp);output.push_back(tmp);}cout<<"Scenario "<<s<<endl;for (int i=0;i<N;i++){cout<<output[i]<<" ";int v = searcher(output[i],1);if (v<MAX&&v>=0)cout<<v;elsecout<<"infinity";cout<<endl;}}//system("pause");return 0;}