hihocoder1067 最近公共祖先·二

本文介绍了一种使用Tarjan算法解决特定图论问题的方法。通过离线算法Tarjan,实现了一个涉及并查集的DFS过程,用以解决图中节点间的关系查询问题。文章详细展示了算法的具体实现步骤,并附带了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

使用tarjan算法,这是一种离线算法。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int, int> pii;
 4 const int MAXN = 100005;
 5 vector<int> G[MAXN], qry[MAXN];
 6 int par[MAXN], vis[MAXN];
 7 void init(int n)
 8 {
 9     for (int i = 0; i <= n; i++) par[i] = i;
10 }
11 int find(int x)
12 {
13     if (par[x] == x) return par[x];
14     return par[x] = find(par[x]);
15 }
16 int uni(int x, int y)
17 {
18     x = find(x); y = find(y);
19     if (x == y) return x;
20     par[x] = y; return y;
21 }
22 void dfs(int u, int f, map<pii, int> & ans)
23 {
24     vis[u] = 1;
25     for (auto it: qry[u])
26     {
27         int tmp = vis[it];
28         if (!tmp) continue;
29         if (tmp == 1)
30             ans[pii(u, it)] = it;
31         else if (tmp == 2)
32             ans[pii(u, it)] = find(it);
33     }
34     for (int i = 0; i < G[u].size(); i++)
35         if (!vis[G[u][i]]) dfs(G[u][i], u, ans);
36     vis[u] = 2;
37     uni(u, f);
38 }
39 int main()
40 {
41     int n, q;
42     cin >> n;
43     string x, y;
44     map<string, int> mp;
45     map<int, string> mp2;
46     int id = 1, root = -1;
47     for (int i = 0; i < n; i++)
48     {
49         cin >> x >> y;
50         int pid = -1, sid = -1;
51         if (!mp.count(x)) { mp[x] = pid = id; mp2[id] = x; id++; }
52         else pid = mp[x];
53         if (!mp.count(y)) { mp[y] = sid = id; mp2[id] = y; id++; }
54         else sid = mp[y];
55         if (i == 0) root = pid;
56         G[pid].push_back(sid);
57     }
58     cin >> q;
59     vector<pii> v;
60     for (int i = 0; i < q; i++)
61     {
62         cin >> x >> y;
63         int xid = mp[x], yid = mp[y];
64         qry[xid].push_back(yid);
65         qry[yid].push_back(xid);
66         v.push_back(pii(xid, yid));
67     }
68     init(n);
69     map<pii, int> ans;
70     dfs(root, 0, ans);
71     for (auto it: v)
72     {
73         int xid = it.first, yid = it.second;
74         pii a(xid, yid), b(yid, xid);
75         if (ans.count(a)) cout << mp2[ans[a]] << endl;
76         else cout << mp2[ans[b]] << endl;
77     }
78     return 0;
79 }

 

转载于:https://www.cnblogs.com/wangyiming/p/9166644.html

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值