这个题目做了一晚上,确定最终方案是:倒排索引+记忆搜索。用一个hashmap存储倒排索引,一个hashmap存储各进程
#include<iostream>
using namespace std;
#include<hash_map>
struct ListNode{
int val;
ListNode *next;
ListNode(int i):val(i),next(NULL){}
};
//ListNode* meetnode(ListNode* pHead)
//{
// if(pHead==NULL)
// return NULL;
// ListNode * slow=pHead->next;
// if(slow==NULL)
// return NULL;
// ListNode *fast=slow->next;
// while(fast!=NULL&&slow!=NULL){
// if(fast==slow)
// return fast;
// slow=slow->next;
// fast=fast->next;
// if(fast!=NULL)
// fast=fast->next;
// }
// return NULL;
//}
int main()
{
hash_map<int,int> ha;
hash_map<int,int> ziyuan;
hash_map<int,int> visited;
int cnt;
cin>>cnt;
for(int i=0;i<cnt;++i)
{
int a,c;
char b[100];
cin>>a>>b>>c;
if(strcmp(b,"0")!=0){
int len=strlen(b);
char * src=b;
for(int i=0;i<=len;++i)
{
if(b[i]==','||i==len)
{
char d[100];
strncpy(d,src,&b[i]-src);
int ee=atoi(d);
ha.insert(pair<int,int>(ee,a));
src=&b[i+1];
}
}
}
if(c!=0)
ziyuan.insert(pair<int,int>(a,c));
visited.insert(pair<int,int>(a,0));
}
int flag=0;
while(!ziyuan.empty())
{
hash_map<int,int>::iterator it=ziyuan.begin();
ListNode *head=new ListNode(it->first);
ListNode *nodebian=head;
//hash_map<int,int>::iterator ittemp=it;
while(1){
hash_map<int,int>::iterator itha=ha.find(it->second);
visited[it->first]=1;
ziyuan.erase(it);
if(itha==ha.end())
break;
else{
it=ziyuan.find(itha->second);
if(it==ziyuan.end()&&visited[itha->second]==0) break;
else if(it==ziyuan.end()&&visited[itha->second]==1) {
flag=1;
cout<<flag<<endl;
return 0;
}
else{
ListNode *node1=new ListNode(it->first);
nodebian->next=node1;
nodebian=node1;
}
}
}
//ListNode * nodemeet=meetnode(head);
//if(nodemeet!=NULL){
// flag=1;
// cout<<flag<<endl;
// return 0;
//}
}
cout<<flag<<endl;
return 0;
}