http://acm.hdu.edu.cn/showproblem.php?pid=3357
题目大意: 所有公司不能购买自己公司的股票,如果a 购买了b 公司的股票,则a 含有b 公司的股票,给出一些购买方案,求出有多少种要拒绝。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<cmath>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;
const int inf = 300;
bool vis[inf+10][inf+10];
int main()
{
int n,m,num=1,i,j,k,a,b;
while(cin>>n>>m)
{
if(n + m == 0) break;
memset(vis,false,sizeof(vis));
int ans = 0;
for(i = 1; i <= n; i++)
vis[i][i] = true;
for(i = 1; i <= m; i++)
{
scanf("%d%d",&a,&b);
if(a == b) {vis[a][b] = true; ans++;}//首先自己不能购买自己的股票
else if(vis[b][a] == true) ans++;//如果b 已经购买了a 的股票,要拒绝
else if(!vis[a][b])//如果a 没有购买过b 的股票,执行下面语句,节省时间
{
//a 要购买b 的股票,凡是购买过a 的公司,和购买过b 的公司都应该标记
for(j = 1; j <= n; j++)
{
if(vis[j][a])
{
for(k = 1; k <= n; k++)
if(vis[b][k]) vis[j][k] = true;
}
}
}
}
cout<<num++<<". "<<ans<<endl;
}
return 0;
}