数据结构作业——直通车(并查集)
直通车
Description
作为一个老司机,开车前最让金金犯难的事就是给乘客们安排座位了,总不 能把俩死对头安排到一起吧!金金决定把这可怕的任务交给你,对任意一对乘客, 请你判断他俩的关系。
Input
输入第一行为三个整数 N, M, K( N 为乘客的数目, 乘客的编号为 1 到 N; M 为已知两两乘客之间的关系数; K 为查询的条数)。 1<=N,M,K<=100。
随后 M 行,每行给出一对乘客之间的关系, 格式为:“ 乘客 1 乘客 2 关系” , 其中“ 关系” 为 1 表示是朋友,为-1 表示是敌人。注意两人不可能既是直接的 朋友又是直接的敌人。
最后 K 行,每行给出一对需要查询的宾客编号。 规定: 朋友的朋友也是朋友(所以两个人可能直接关系上是敌人但间接关系 上是朋友)。但敌人的敌人并不一定就是朋友,朋友的敌人也不一定是敌人。 也 就是说只有朋友的关系能传递,而敌人的关系则不能。
Output
对每个查询输出一行结果:若两位乘客之间是朋友,且没有敌对关系,则输 出“Good job”; 若他们之间并不是朋友,但也不敌对,则输出“No problem”;若 他们之间有敌对,然而也有共同的朋友,则输出“OK but...”;若他们之间仅有敌 对关系,则输出“No way”。
Sample Input
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
Sample Output
Good job
No problem
OK but...
No way
思路
如果两者之间的关系是朋友,则将他们合并起来,如果两者是敌人,则建立邻接表存取每个人的敌人是谁,在判断二者关系的时候,如果两人是朋友,则在他们各自的邻接表查找有没有对方出现,有的话说明既是朋友,又是敌人。
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 105; int tot = 0,fa[maxn],head[maxn]; struct Edge{ int to,next; }edge[maxn<<1]; int find( int x) { int r = x; while (r != fa[r]) r = fa[r]; int i = x,j; while (i != r) { j = fa[i]; fa[i] = r; i = j; } return r; } void unite( int x, int y) { int fx = find(x),fy = find(y); if (fx == fy) return ; fa[fx] = fy; } void addedge( int u, int v) { edge[tot].to = v,edge[tot].next = head[u]; head[u] = tot++; } int main() { //freopen("input.txt","r",stdin); int N,M,K,x,y,opt,i; bool flag; scanf ( "%d%d%d" ,&N,&M,&K); for (i = 0;i <= N;i++) fa[i] = i,head[i] = -1; while (M--) { scanf ( "%d%d%d" ,&x,&y,&opt); if (opt == 1) unite(x,y); else { addedge(x,y); addedge(y,x); } } while (K--) { scanf ( "%d%d" ,&x,&y); if (find(x) == find(y)) { flag = true ; for (i = head[x];i != -1;i = edge[i].next) { if (edge[i].to == y) flag = false ; } if (flag) printf ( "Good job\n" ); else printf ( "OK but...\n" ); } else { flag = true ; for (i = head[x];i != -1;i = edge[i].next) { if (edge[i].to == y) flag = false ; } if (flag) printf ( "No problem\n" ); else printf ( "No way\n" ); } } return 0; } |
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)