Problem Description
XX高校往届某班同学决定举行毕业十周年聚会。由于毕业后各奔东西,同学们在n个不同的城市工作(编号从1到n),n个城市共有e班飞机(可视为有向边或弧),有空参加聚会的同学有t位,为了避免聚会这天有的城市航班无法到达,请找出n个城市中有几个城市是每位同学都能到达的。
Input
有多组数据,每组第一行为t、n和e(0<t<50,0<n<100,0<e<500);接下来t行,每行一个正整数,表示有空参加聚会的同学所在的城市编号;最后e行,每行给出两个正整数,代表一条弧的弧尾和弧头。
Output
每组占一行,输出每位同学都能到达的城市个数。
Sample Input
2 4 4
2
3
1 2
1 4
2 3
3 4
参考代码1:有向图广度遍历
#include<iostream>
using namespace std;
int city[100],visited[100];
void BFS(int arc[][100],int n,int v)
{
int front=-1,rear=-1,Q[100];
Q[++rear]=v;visited[v]=1;
while(front!=rear)
{
front++;
city[Q[front]]++;
for(int j=1;j<=n;j++)
{
if(visited[j]==0 && arc[Q[front]][j]==1)
{Q[++rear]=j;visited[j]=1;}
}
}
}
int main()
{
int t,n,e,i,j,k,arc[100][100],v[50];
while(cin>>t>>n>>e)
{
for(i=0;i<t;i++){cin>>v[i];}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)arc[i][j]=0;
city[i]=0;
}
for(k=0;k<e;k++)
{
cin>>i>>j;
arc[i][j]=1;
}
for(i=0;i<t;i++)
{
for(j=1;j<=n;j++){visited[j]=0;}
BFS(arc,n,v[i]);
}
k=0;
for(i=1;i<=n;i++)
{
if(city[i]==t)k++;
}
cout<<k<<endl;
}
return 0;
}
参考代码2:有向图深度遍历
#include<iostream>
using namespace std;
int city[100],visited[100];
void DFS(int arc[][100],int n,int v)
{
city[v]++;visited[v]=1;
for(int j=1;j<=n;j++)
{
if(visited[j]==0 && arc[v][j]==1)
{DFS(arc,n,j);}
}
}
int main()
{
int t,n,e,i,j,k,arc[100][100],v[50];
while(cin>>t>>n>>e)
{
for(i=0;i<t;i++){cin>>v[i];}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)arc[i][j]=0;
city[i]=0;
}
for(k=0;k<e;k++)
{
cin>>i>>j;
arc[i][j]=1;
}
for(i=0;i<t;i++)
{
for(j=1;j<=n;j++){visited[j]=0;}
DFS(arc,n,v[i]);
}
k=0;
for(i=1;i<=n;i++)
{
if(city[i]==t)k++;
}
cout<<k<<endl;
}
return 0;
}