/*
判断方式:
(1). 进入循环,找到他所有的朋友和敌人
(2). 检索他所有朋友的敌人和所有敌人的朋友,与当前预握手的人对比
(3). 若上述两种情况匹配成功,不握手,不成功,握手。
*/
#include <stdio.h>
int main(int argc, const char * argv[])
{
int n = 0;
int p = 0;
int q = 0;
int count = 0;
int u = 0;
int v = 0;
scanf("%d %d %d\n", &n, &p, &q);
int friend_arr[n][n]; /*存储朋友/敌人关系的数组,计划中,若二人为某种关系,则对应位置的值为1 */
int enemy_arr[n][n]; //比如 1 和 3 为朋友,则friend_arr[1][3] = 1 且 friend_arr[3][1] = 1
for (int i = 0; i < n; i++) //初始化数组,因为是二维数组并且上限要求用户输入所以无法使用函数
{
for (int j = 0; j < n; j++)
{
friend_arr[i][j] = 0;
enemy_arr[i][j] = 0;
}
}
//1. 从键盘赋值数据 (以下步骤在学完指针后可以封装成函数)
for (int i = 0; i < p; i++) //朋友数组添加数据 本循环用于添加p条朋友关系
{
scanf("%d %d", &u, &v);
for (int j = 0; j < n; j++) //这两个循环则是为了在输入的位置添加数据
{
for (int k = 0; k < n; k++)
{
if (j == u - 1 && k == v - 1) //+1的原因: 数组是从下标0开始的,而对人的编号则是从1开始
{
friend_arr[k][j] = 1;
friend_arr[j][k] = 1;
}
else if (j == v - 1 && k == u - 1)
{
friend_arr[k][j] = 1;
friend_arr[j][k] = 1;
}
}
}
}
for (int i = 0; i < q; i++) //朋友数组添加数据 本循环用于添加q条敌人关系
{
scanf("%d %d", &u, &v);
for (int j = 0; j < n; j++) //这两个循环则是为了在输入的位置添加数据
{
for (int k = 0; k < n; k++)
{
if (j == u - 1 && k == v - 1)
{
enemy_arr[k][j] = 1;
enemy_arr[j][k] = 1;
}
else if (j == v - 1 && k == u - 1)
{
enemy_arr[k][j] = 1;
enemy_arr[j][k] = 1;
}
}
}
}
/*2. 握手判断【核心】*/
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (friend_arr[i][j] == 1)
{
count += 1; //是朋友,握手
}
else if (enemy_arr[i][j] == 1)
{
continue; //是敌人,不握手,继续下一个循环
}
else
{ //陌生人,判断有没有一人的朋友是另一人的敌人
for (int k = 0; k < n; k++) //这里照样该封函数,只是目前不会 这里不是i+1,因为我要的是他所有的敌友
{
if (friend_arr[i][k] == 1 && enemy_arr[j][k] == 1)
{
break;
}
else if (enemy_arr[i][k] == 1 && friend_arr[j][k] == 1)
{
break;
}
else if (k == n-1) //k循环完了,没有出现k同时是一人的朋友和另一人的敌人,i j握手
{
count += 1;
}
}
}
}
}
printf("%d\n", count);
return 0;
}