10044-Erdos number Time limit exceeded

以下是我的代码,但是在通过uva测试是time limit exceeded, 不知道是什么原因,而且我自己测试了几个数据都是对的。

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<stdio.h>
#include<algorithm>

using namespace std;

string Erdos="Erdos, P.";
string Scenario="Scenario ";
string Infinity="infinity";
map<string,int> Scientists;

void loopFind(map<int,vector<string> > map_name,vector<string> parters,vector<int> lines,int value){
	if(parters.size()<=0)return;

	for(int i=0;i<parters.size();++i){
		vector<string> parter1;
		vector<int> lines1;
		string tmp=parters.at(i);
		for(map<int,vector<string> >::iterator it=map_name.begin();it!=map_name.end();++it){
			vector<string> tmpNames=it->second;
			vector<int>::iterator tmpIndex=find(lines.begin(),lines.end(),it->first);
			vector<string>::iterator it1=find(tmpNames.begin(),tmpNames.end(),tmp);
			if(tmpIndex!=lines.end())break;
			else if(it1!=tmpNames.end()){
				for(int j=0;j<tmpNames.size();++j){
					string tmp1=tmpNames.at(j);
					if(tmp1!=tmp){
						Scientists[tmp1]=value;
						parter1.push_back(tmp1);
					}
				}
				lines1.push_back(it->first);
			}
		}
		loopFind(map_name,parter1,lines1,value+1);
	}
}

void findScientists(map<int,vector<string> > map_name){
	Scientists[Erdos]=0;
	vector<string> parters;
	vector<int> lines;
	
	for(map<int,vector<string> >::iterator it=map_name.begin();it!=map_name.end();++it){
		vector<string> names=it->second;
		vector<string>::iterator tmp=find(names.begin(),names.end(),Erdos);
		if(tmp!=names.end()){
			for(int i=0;i<names.size();++i){
				string tmp1=names.at(i);
				if(tmp1!=Erdos){
					Scientists[tmp1]=1;
					parters.push_back(tmp1);
				}
			}
			lines.push_back(it->first);
		}
	}
	loopFind(map_name,parters,lines,2);
}

void getErdosNumber(vector<string> paper,vector<string> names){
	int index=1;
	map<int,vector<string> > map_name;
	
	for(vector<string>:: iterator it=paper.begin();it!=paper.end();++it){
		string tmpString=*it;
		vector<string> tmpSci;
		int begin=0;
		int end=0;
		if(tmpString.length()<1)continue;
		while(end<tmpString.length()){
			if(tmpString[end]=='.'&&tmpString[end+1]==','&&tmpString[end+2]==' '){
				string tmpName=tmpString.substr(begin,end-begin+1);
				tmpSci.push_back(tmpName);
				begin=end+3;
				end=begin;
			}
			else if(tmpString[end]==':'){
				string tmpName=tmpString.substr(begin,end-begin);
				tmpSci.push_back(tmpName);
				break;
			}
			else ++end;

		}

		map_name[index]=tmpSci;
		++index;
	}

	findScientists(map_name);
}

int main(){
	int n=0;
	cin>>n;

	for(int i=1;i<=n;++i){
		int P=0;
		int N=0;
		cin>>P>>N;
		if(P<1||N<1)continue;

		getchar();	
		vector<string> paper;
		for(int x=0;x<P;++x){
			string tmpPaper;
			getline(cin,tmpPaper);
			paper.push_back(tmpPaper);
		}

		vector<string> names;
		for(int y=0;y<N;++y){
			string tmpName;
			getline(cin,tmpName);
			names.push_back(tmpName);
		}

		Scientists.clear();
		getErdosNumber(paper,names);

		cout<<Scenario<<i<<endl;
		map<string,int>::iterator it;
		
		for(vector<string>::iterator ite=names.begin();ite!=names.end();++ite){
			it=Scientists.find(*ite);
			if(it!=Scientists.end()){
				 cout<<it->first<<" "<<it->second<<endl;
			}
			else{
				cout<<*ite<<" "<<Infinity<<endl;
			}
		}
	}
	return 0;
}

如果有人知道为什么会是time limit exceeded, 烦请告知,谢谢

你可能感兴趣的:(C++,ACM)