PAT 乙级 1090 危险品装箱
1. 题目简述及在线测试位置
1.1 已知一系列的不相容物品(若A B放到一起,会触发爆炸),给定N批不同种类的物品,判定是否会触发爆炸
1.2 在线测试位置: 1090 危险品装箱
2. 基本思路
2.1 本质是图问题:物品可以抽象为图的顶点,不相容物品 可以抽象为 这两个顶点之间存在一条边
2.2 根据输入数据建图:由于顶点范围是(0,100000),导致无法使用邻接矩阵(二维数组),因此采用邻接表进行数据的存储。对于本题,实际上只需要建立图的头节点及邻接点就可以了
#define MAX 100000
typedef struct AdjNode* PtrNode;
struct AdjNode
{
int ID;
PtrNode Next;
};
struct HeadNode //头结点
{
PtrNode PtrN; //邻接点
};
struct HeadNode* Head;
Head = (struct HeadNode*)malloc(sizeof(struct HeadNode) * MAX);
2.3 将顶点之间的关系存入邻接表后,对待判定的数据(也就是一系列的图顶点)进行判定:若发现任意俩俩顶点之间存在边,则不可以装在一个箱子;反之,可以装在一个箱子
3. 完整AC代码
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAX 100000
typedef struct AdjNode* PtrNode;
struct AdjNode
{
int ID;
PtrNode Next;
};
struct HeadNode
{
PtrNode PtrN; //邻接点
};
struct HeadNode* Head;
bool Search(int HNode, int Node);
void Insert(int Node1, int Node2);
int main()
{
Head = (struct HeadNode*)malloc(sizeof(struct HeadNode) * MAX);
for (int i = 0; i < MAX; i++) //初始化图的头节点
Head[i].PtrN = NULL;
int Pair, Pieces; //俩俩关系数 待检查的物品批次
cin >> Pair >> Pieces;
int Node1, Node2;
for (int i = 0; i < Pair; i++) //将俩俩关系存入邻接表
{
cin >> Node1 >> Node2;
Insert(Node1, Node2);
Insert(Node2, Node1);
}
int N,Data;
for (int p = 0; p < Pieces; p++)
{
cin >> N;
int *a = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++)
{
cin >> Data;
a[i] = Data;
}
int i;
for (i = 0; i < N; i++)
{
int j;
for (j = i + 1; j < N; j++) //检查任意两个顶点是否存在边
{
if ( Search(a[i], a[j]) ) //若两个顶点存在边,则不安全
{
cout << "No" << endl;
break;
}
}
if (j < N)
break;
}
if (i < N);
else
cout << "Yes" << endl;
}
return 0;
}
bool Search(int HNode,int Node) //判定Node是否是头结点HNode的邻接点
{
PtrNode PtrN;
PtrN = Head[HNode].PtrN;
while (PtrN != NULL)
{
if (PtrN->ID == Node)
{
return true; //
}
else
{
PtrN = PtrN->Next;
}
}
return false;
}
void Insert(int HNode, int Node) //将节点Node插入头结点HNode
{
PtrNode PtrN ,tmp ;
if (!Search(HNode, Node))
{
PtrN = (struct AdjNode*)malloc(sizeof(struct AdjNode));
PtrN->ID = Node;
PtrN->Next = NULL;
tmp = Head[HNode].PtrN;
Head[HNode].PtrN = PtrN;
PtrN->Next = tmp;
}
return;
}