原因代码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, 烦请告诉,感谢

文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
  最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

posted @ 2013-05-03 19:46  xinyuyuanm  阅读(483)  评论(0编辑  收藏  举报