首页 > 代码库 > HDU 3357
HDU 3357
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\n",cas++,ans); } return 0;}
HDU 3357
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。