http://acm.hdu.edu.cn/showproblem.php?pid=3357
给出公司间的控股关系,问有多少组不合法数据,自己控股自己不合法,a控股b,b控股c,则a控股c
其实就是找环,加一条边如果出现环ans++,但是每次搜一遍有没有环会tle。此处用邻接矩阵处理,如果a要控股b,则控股a的公司都控股b,并且a控股的公司都被控股a的控股。对于b的分析同理,此题有大量重复数据,需要去掉
#include <iostream> #include <cstdio> #include <cstring> #include <map> #include <algorithm> #include <queue> #include <cmath> #include <stack> #include <set> using namespace std; int mp[300][300]; int n; void add(int a,int b){ mp[a][b]=1; for(int i=1;i<=n;i++) if(mp[i][a]){ mp[i][b]=1; for(int j=1;j<=n;j++) if(mp[a][j]) mp[i][j]=1; } for(int i=1;i<=n;i++) if(mp[b][i]){ mp[a][i]=1; for(int j=1;j<=n;j++) if(mp[j][b]) mp[j][i]=1; } } int main(){ int t; int cas=1; while(~scanf("%d%d",&n,&t)){ if(!n && !t)break; memset(mp,0,sizeof(mp)); int ans=0; while(t--){ int a,b; scanf("%d%d",&a,&b); if(mp[b][a])ans++; else if(a==b)ans++; else if(!mp[a][b]) add(a,b);//关键,去除重复边,直接else会TLE } printf("%d. %d ",cas++,ans); } return 0; }