中间的球 | ||||||
|
||||||
Description | ||||||
有N个外形一样但重量不同的球,N是一个奇数,每个球被标号为1、2、...、N,你的任务是 找到重量在中间的那个球, 我们可以通过一些比较得知某些球比其他的球要中或者轻,从而找 到一些不可能是重量处在中间的球,比如: 给定N=5个球和M=4次比较, 2比1重 4比3重 5比1重 4比2重 因为2 4 5都比1重,而1 2 3又都比4轻,从而能够判断1和4是不可能为重量处在中间的那个球。 现在请写一个程序,来找出有多少个球可以判断出不可能是中间重量的球。 |
||||||
Input | ||||||
输入数据首先包括一个整数t,表示测试数据组数,然后是t组测试数据,每组包括一个整数N,M,然后 为M行每行两个整数a,b表示a比b重。N<=100 | ||||||
Output | ||||||
输出能够确定不可能在中间的球的数量 | ||||||
Sample Input | ||||||
1 5 4 2 1 4 3 5 1 4 2 | ||||||
Sample Output | ||||||
2 |
一开始相处了个土办法,那就是先更新一下,水过了;
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int a[101][101]; void gengxin(int x,int y,int n) { int i; for(i=1;i<=n;i++) { if(a[i][x]==1&&a[i][y]==0) { a[i][y]=1; gengxin(i,y,n); } } } int chazhao1(int x,int n) { int i,sum1=0; for(i=1;i<=n;i++) { if(a[i][x]==1) { sum1++; } } return sum1; } int chazhao2(int x,int n) { int i,sum=0; for(i=1;i<=n;i++) { if(a[x][i]==1) { sum++; } } return sum; } int main() { int t,N,M,a1,b; while(~scanf("%d",&t)) { while(t--) { scanf("%d%d",&N,&M); int i,j; for(i=0;i<=N;i++) { for(j=0;j<=N;j++) { a[i][j]=0; } } for(i=0;i<M;i++) { scanf("%d%d",&a1,&b); a[a1][b]=1; } for(i=1;i<=N;i++) { for(j=1;j<=N;j++) { if(a[i][j]==1) { gengxin(i,j,N); } } } int x=N/2+1; int num=0; for(i=1;i<=N;i++) { if(chazhao1(i,N)>=x) { num++; } else if(chazhao2(i,N)>=x) { num++; } } printf("%d\n",num); } } return 0; }
其实这个题的标准解法是floyd算法,关于floyd,参考大神博客http://blog.csdn.net/zhongkeli/article/details/8832946
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<queue> #include<set> using namespace std; int a[101][101]; int findMax(int x,int n) { int i,sum=0; for(i=1;i<=n;i++) { if(a[i][x]==1) { sum++; } } return sum; } int findMin(int x,int n) { int i,sum=0; for(i=1;i<=n;i++) { if(a[x][i]==1) { sum++; } } return sum; } int main() { int T; while(~scanf("%d",&T)) { while(T--) { memset(a,0,sizeof(a)); int n,m; scanf("%d%d",&n,&m); int i; int x,y; for(i=0;i<m;i++) { scanf("%d%d",&x,&y); a[x][y]=1; } int j,k; for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(a[i][k]==1&&a[k][j]==1)//最重要的就是这点 { a[i][j]=1; } } } } int sum=0; for(i=1;i<=n;i++) { if(findMax(i,n)>n/2||findMin(i,n)>n/2) { sum++; } } printf("%d\n",sum); } } return 0; }