题目描述
同学们应该学会多交一些好朋友。朋友关系是相互的,A 是 B 的好朋友,则 B 也是 A 的好朋友。朋友关系是不传递的,A 是 B 的好朋友,B 是 C 的好朋友,但 A 和 C 不一定是好朋友。现在给出某小学部分同学之间的朋友关系,请编程统计朋友最多的人有多少个好朋友。
输入
输入共m+1行。
第1行是两个整数n和m,分别表示同学总人数和朋友关系对数。
第2行到第m+1行,描述了m对朋友关系。每行两个用单个空格隔开的同学姓名。
每个人的姓名仅由小写字母组成,且1≤姓名的长度≤10。
输出
输出共 1 行。
一个整数,表示朋友最多的人有多少个好朋友。
分析:
这个题目是我的一个比赛题目,没有做出来,后来听学长讲的,才有了点思路。
其实这个题目的关键就是判断,这个字符串出现过没有,并且成对出现的字符串有什么关系。
学长的思路很好,如果不是字符串,而是一堆数字,就可以用二维数组表示,比如说a[1][2] a[1][3],这样我们把1 2 1 3标记为1,然后把第一行的加起来,就是数字1的朋友。但是有可能数字一 会是别人的朋友,比如说 3 1,这样1和3也是朋友,所以1的朋友数为,1这一行的和+1这一列的和。但是2 1 1 2重了,所以应该把其中一个标为0。这样做一个判断就好。
问题的关键在于 怎么把字符串转为下标。
写一个函数 pos函数:
char s[200][50];
int cnt=1;
int pos(char x[])
{
for(int i=0;i<cnt;i++)
if(strcmp(s[i],x)==0)
return i;
strcpy(s[cnt++],x);
return cnt-1;
}
用到了字符串里面的函数,初始cnt=0,直接把一个字符串复制到二维数组s[][]中,以此推,下一次如果出现一样的,那么这个字符串代表的数字,否则放到下一个一维数组中,并且设为一个新的下标。这样就把每一个字符串都有了一个数字与其对应。
每次输入一对,都把这一对转化成对应的数字,比如说 a c c b 代表的矩阵就是
0 1 0
0 0 1
0 0 0
这个矩阵的意思:第一个输进的数是a,第二个输进去的数是c,第三个为b,他们分别对应 1 2 3,所以从矩阵可以看出,1 2 是朋友。2 3也是朋友。所以最多朋友是1.
具体实现代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
char s[200][50];
int cnt=1;
bool cmp(int a,int b)
{
return a>b;
}
int pos(char x[])
{
for(int i=0;i<cnt;i++)
if(strcmp(s[i],x)==0)
return i;
strcpy(s[cnt++],x);
return cnt-1;
}
int main()
{
int m,n;
int a[200][200];
char s1[500],s2[500];
int ans[2000];
int x,y,z;
int vis[200][200];
int num=1;
int sum[200];
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%s%s",s1,s2);
x=pos(s1);
y=pos(s2);
if(!vis[y][x])
vis[x][y]=1;
}
/*for(int i=1;i<=cnt-1;i++)
{
for(int k=1;k<=m;k++)
printf("%2d",vis[i][k]);
printf("\n");
}*/
for(int i=1;i<=m;i++)
{
for(int k=1;k<=m;k++)
{
sum[i]+=vis[i][k];
sum[i]+=vis[k][i];
}
}
sort(sum+1,sum+1+cnt,cmp);
printf("%d",sum[1]);
return 0;
}
简单代码,大神勿喷。