解题思路:首先理解本题考察的是**拓扑排序

有考虑到时间可能会超时,所有进行 双向 搜索

set<int>str_out[26];//记录出度 

 set<int>str_in[26];//记录入度为0的点同时保存点的边信息 

memset(station,0,sizeof(station));

 while(scanf("%s",&str)!=EOF)

 {

     str_out[str[0]-'A'].insert(str[2]-'A');        //str[0] - 'A'表示的是某一个字符 对应的  出度 指向(A--->B)

     str_in[str[2]-'A'].insert(str[0]-'A');//这个在后边用于找入度为0的点和存储边信息

     station[str[0]-'A']=1;//记录排队的人,

     station[str[2]-'A']=1; 

 }

接下来就是 进队列的了         首先是入度为零   的开始进行入队列 

queue<int>p;

     int ans[26],k=0;//记录排队顺序 

     for(int i=0;i<26;i++)

     {

         if(str_in[i].size()==0&&station[i])//两者缺一不可 

         p.push(i);//入度为0的入队 

     }


//接下来就是出队列了

while(!p.empty()) 

     {

         int j=p.front(); //开始消除 每个入度为零的

         for(set<int>::iterator it=str_out[j].begin();it!=str_out[j].end();it++)

         {

             int t=*it;

             str_in[t].erase(j);//删除t点的所有出边       消除边   !!!

             if(str_in[t].size()==0)

             p.push(t);//将t点入队(因为他已经是入度为0的点) 

         }

         str_out[j].clear();//删除j点的所有出边 

         ans[k++]='A'+j;

         p.pop(); 

     }

直到 队列为空 则所有的 遍历完成


***************************

#include<bits/stdc++.h> 

using namespace std;

int main()

{

 int station[26];//保存在本次排队中的点 

 char str[3];

 set<int>str_out[26];//记录出度 

 set<int>str_in[26];//记录入度为0的点同时保存点的边信息 

 memset(station,0,sizeof(station));

 while(scanf("%s",&str)!=EOF)

 {

     str_out[str[0]-'A'].insert(str[2]-'A');

     str_in[str[2]-'A'].insert(str[0]-'A');//这个在后边用于找入度为0的点和存储边信息

     station[str[0]-'A']=1;//记录排队的人,用于找入度为0的点

     station[str[2]-'A']=1; 

 }

     queue<int>p;

     int ans[26],k=0;//记录排队顺序 

     for(int i=0;i<26;i++)

     {

         if(str_in[i].size()==0&&station[i])//两者缺一不可 

         p.push(i);//入度为0的入队 

     }

     while(!p.empty()) 

     {

         int j=p.front();

         for(set<int>::iterator it=str_out[j].begin();it!=str_out[j].end();it++)

         {

             int t=*it;

             str_in[t].erase(j);//删除t点的所有出边

             if(str_in[t].size()==0)

             p.push(t);//将t点入队(因为他已经是入度为0的点) 

         }

         str_out[j].clear();//删除j点的所有出边 

         ans[k++]='A'+j;

         p.pop(); 

     }

     

     

     

     int i;

     for( i=0;i<26;i++)

     if(str_in[i].size()>0)//有环存在

     break;

     if(i==26)

     {

         for(int j=0;j<k;j++)

         printf("%c",ans[j]);

     }

     else

     printf("No  Answer!\n");

 return 0;

}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论