师生树(穷举)
来源:互联网 发布:lols7版本强势英雄知乎 编辑:程序博客网 时间:2024/04/27 14:18
题目:用(A,B)表示B是A的1代学生。如果没有人是A的老师,那么A称为祖师爷。输入一组师生关系,求出师生树的总数,并分别输出成员:师祖及各代学生。
ps:字符A与B是大写或小写字母,大小写有别;
输入: 输出:
5 Case 1:
A B 1:A B C E
B C 2:D E
A E Tatal=2
B E
D E
思路: 求师生树的成员,首先应该知道师祖元素,师祖元素通过枚举没人是其老师而获知,然后寻找与师祖有关系的学生,可通过传递闭包。
代码:
#include <iostream>#include <cstring>using namespace std;#define MAXN 60int e,count;int G[MAXN][MAXN];int visit[MAXN];void solve(){//传递闭包 for(int k=0;k<60;k++) for(int i=0;i<60;i++) for(int j=0;j<60;j++) if(G[i][k]&&G[k][j]) G[i][j]=1;//枚举祖先元素 int num=0;for(int k=0;k<60;k++){bool flag=true;for(int i=0;i<60;i++) if(G[i][k]||!visit[k])//两个判别条件缺一不可 { flag=false; break;}if(flag)//若k是一个祖先{cout<<++num<<":";cout<<char('A'+k);for(int i=0;i<60;i++) if(G[k][i]) cout<<" "<<char('A'+i);cout<<endl; }}count=num;} int main(){int cas=0;char x,y;while(cin>>e&&e){memset(G,0,sizeof(G));memset(visit,0,sizeof(visit));count=0;for(int i=0;i<e;i++){cin>>x>>y;int u=x-'A',v=y-'A';G[u][v]=1;visit[u]=1;visit[v]=1;}cout<<"Case"<<++cas<<":"<<endl;solve();cout<<"Total="<<count<<endl;}}
阅读全文
0 0
- 师生树(穷举)
- 师生帮手(1)
- 师生帮手(2)
- 师生帮手(3)
- 师生帮手(4)
- 蛮力法(一):穷举
- 换分币(穷举法)
- 年龄(穷举法)
- 枚举(又称穷举)
- 马农???(穷举+哈希)
- 排列(暴力穷举)
- “暴力”枚举(穷举)
- 穷举
- 穷举
- 穷举
- 穷举
- 穷举
- C++程序设计师生互动(2012年春第6周)
- Linux学习之路2 Bash的基本操作
- java实训第六天8/02
- 我不想被道德绑架
- 库存管理系统之添加产品校验
- Xor Sum HDU
- 师生树(穷举)
- 线程的创建、终止
- java实训第八天8/03
- HSTS安全策略在浏览器中的应用
- 套接字(Socket)
- Thinkphp 模板->变量输出
- java实训第九天8/04
- ActiveMQ简介
- JS雪花飘落