该题目的要点是如何把名字和编号匹配起来
主要运用了map
#include <stdio.h>
#include <vector>
#include <queue>
#include <string>
#include <map>
using namespace std;
vector<int> edge[1010];
queue<int> Q;
map<string, int> people;
int num;
int inDegree[1010];
//初始化各类参数
void init(){
num=0;
people.clear();
while(Q.empty()==false) Q.pop();
for(int i=0;i<1010;i++){
inDegree[i]=0;
edge[i].clear();
}
}
//从string里获得编号
int findPeople(string name){
map<string,int>::iterator it=people.find(name);
if(it!=people.end())
return it->second;
else{
num++;
people.insert(pair<string,int>(name,num));
return num;
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n==0) break;
init();
//输入到邻接链表里
for(int i=0;i<n;i++){
char a[50],b[50];
scanf("%s%s",a,b);
int a1=findPeople(a);
int a2=findPeople(b);
inDegree[a2]++;
edge[a1].push_back(a2);
}
//入度为0的进队列
for(int i=1;i<=num;i++){
if(inDegree[i]==0) Q.push(i);
}
if(Q.size()!=1){
printf("No\n");
continue;
}
int cnt=0;
//拓扑排序主体
while(Q.empty()==false){
int newP=Q.front();
Q.pop();
cnt++;
for(int i=0;i<edge[newP].size();i++){
inDegree[edge[newP][i]]--;
if(inDegree[edge[newP][i]]==0){
Q.push(edge[newP][i]);
}
}
}
if(cnt==num)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
部分代码优化,从string里获得编号
int findPeople(string name){
if(people.find(name)!=people.end())
return people[name];
else{
num++;
people[name]=num;
return num;
}
}