学习笔记--图论DFS,联通分量,时间戳

本文介绍了一个使用深度优先搜索(DFS)算法遍历图的数据结构示例,并展示了如何通过递归实现节点的访问及连通分量的计算。代码中定义了图的邻接表表示法,并实现了基于递归的DFS遍历过程,记录了节点的访问时间及退出时间,同时为每个连通分量分配了唯一标识。

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

  1 #include<iostream>
  2 #include<vector>
  3 using namespace std;
  4 
  5 const int maxn=12;
  6 
  7 int vis[maxn];
  8 
  9 vector<int> G[maxn];
 10 
 11 
 12 int dfs_clock;
 13 int pre[maxn];
 14 int post[maxn];
 15 int cc[maxn];
 16 int current_cc=0;
 17 void dfs(int u)
 18 {
 19   //pre
 20 
 21    vis[u]=1;
 22    pre[u]=++dfs_clock;
 23    cc[u]=current_cc;
 24    for(int i=0;i<G[u].size();i++)
 25    {
 26        int v=G[u][i];
 27       if(!vis[v]) dfs(v);
 28 
 29    }
 30 
 31    post[u]=++dfs_clock;
 32   //post
 33 }
 34 
 35 void init()
 36 {
 37   for(int i=0;i<12;i++)
 38     vis[i]=0;
 39 
 40   G[0].push_back(1);
 41   G[0].push_back(4);
 42 
 43   G[1].push_back(0);
 44 
 45   G[2].push_back(3);
 46   G[2].push_back(6);
 47   G[2].push_back(7);
 48 
 49 
 50   G[3].push_back(2);
 51   G[3].push_back(7);
 52 
 53 
 54   G[4].push_back(0);
 55   G[4].push_back(8);
 56   G[4].push_back(9);
 57 
 58 
 59   G[6].push_back(2);
 60    G[6].push_back(7);
 61     G[6].push_back(10);
 62 
 63   G[7].push_back(2);
 64   G[7].push_back(3);
 65   G[7].push_back(6);
 66   G[7].push_back(10);
 67   G[7].push_back(11);
 68 
 69   G[8].push_back(4);
 70   G[8].push_back(9);
 71 
 72 
 73   G[9].push_back(4);
 74    G[9].push_back(8);
 75 
 76     G[10].push_back(6);
 77     G[10].push_back(7);
 78 
 79     G[11].push_back(7);
 80 
 81     dfs_clock=0;
 82 }
 83 
 84 
 85 int main()
 86 {
 87     init();
 88 
 89     for(int i=0;i<12;i++)
 90     {
 91        if(vis[i]==0)
 92        {
 93            current_cc++;
 94            dfs(i);
 95        }
 96 
 97     }
 98 
 99 
100 
101    //    dfs(0);
102     for(int i=0;i<12;i++)
103        cout<<i+1<<" "<<pre[i]<<" "<<post[i]<<" "<<cc[i]<<endl;
104 
105 
106 }

 

转载于:https://www.cnblogs.com/814jingqi/p/3247212.html

<think>好的,我现在需要解决用户的问题:如何计算两个JavaScript时间戳的差值,并判断是否超过十分钟。用户提到时间戳是JavaScript的,但之前的引用中提到了PHP时间戳是10位,而JS是13位,这可能需要注意单位转换。 首先,用户的需求是判断两个时间戳的差是否超过十分钟,也就是600秒或者600000毫秒。因为JavaScript的时间戳通常是13位的毫秒级,所以应该直接使用毫秒进行计算,这样更准确。 接下来,我需要考虑如何获取这两个时间戳的差值。根据用户之前的回答,推荐使用Date.now()或者new Date().getTime()来获取当前时间戳。假设用户有两个时间戳,比如startTime和endTime,那么差值就是endTime - startTime。 然后,判断这个差值是否大于10分钟。10分钟等于600,000毫秒,所以条件应该是差值 > 10*60*1000。不过用户可能需要考虑是否包括等于的情况,比如是否超过或等于十分钟,这时候条件应该是差值 >= 600000。需要确认用户的具体需求,但一般情况下,“超过”可能指的是严格大于,所以用>。 不过用户提供的引用中有一个comptime函数,里面处理了PHP的10位时间戳转换为JS的13位的情况,可能用户的时间戳来源不同,比如有一个是PHP生成的10位秒级时间戳,另一个是JS的毫秒级。这时候需要将10位的时间戳乘以1000转换为毫秒,再计算差值。例如,如果beginTime是PHP的10位时间戳,那么在JS中需要先乘以1000,再和JS的时间戳相减。 所以,步骤可能包括: 1. 确保两个时间戳单位一致,都是毫秒级。如果是PHP的10位,需要乘以1000。 2. 计算差值,取绝对值,避免顺序问题。 3. 判断差值是否超过10分钟(600,000毫秒)。 另外,用户可能需要处理时间戳的获取方式,比如如何正确获取当前时间戳,或者如何将字符串转换为时间戳。例如,用户可能有一个时间戳来自服务器(PHP生成),另一个是前端生成的,这时候需要注意转换。 还要注意JavaScript中月份是从0开始的,但这个问题更多是在生成特定日期的时间戳时需要注意,而当前时间戳的获取可能不需要。此外,考虑到时区问题,时间戳通常是UTC时间,所以计算差值时一般不受时区影响,但如果用户处理的是本地时间,可能需要额外考虑,不过时间戳本身是UTC的,所以差值计算应该没问题。 总结下来,解决方案的核心步骤是: - 统一时间戳的单位(毫秒) - 计算差值的绝对值 - 比较是否超过10分钟的毫秒数 可能还需要处理时间戳的来源,比如是否有来自PHP的10位时间戳,这时候需要转换。例如,如果有一个时间戳是10位的,需要先乘以1000转换为13位,再与另一个JS时间戳相减。 示例代码可能如下: function isOverTenMinutes(timestamp1, timestamp2) { // 假设timestamp1和timestamp2都是JS时间戳(13位),或者其中一个需要转换 const time1 = timestamp1.toString().length === 10 ? timestamp1 * 1000 : timestamp1; const time2 = timestamp2.toString().length === 10 ? timestamp2 * 1000 : timestamp2; const difference = Math.abs(time2 - time1); return difference > 10 * 60 * 1000; // 超过10分钟 } 这样处理可以兼容10位和13位的时间戳,自动转换,并计算差值。同时使用Math.abs来确保无论两个时间戳的顺序如何,都能得到正确的时间差绝对值。 另外,用户可能需要考虑边界情况,例如刚好等于十分钟是否算作超过,这时候可以调整条件为>= 600000。需要根据具体需求来决定。 最后,给出清晰的代码示例和解释,确保用户能理解如何处理不同来源的时间戳,并进行正确的比较。</think>在JavaScript中判断两个时间戳差值是否超过十分钟,需考虑**时间戳单位统一**和**时差计算精度**。以下是实现方法和注意事项: --- ### 一、核心实现代码 ```javascript // 判断两个时间戳差值是否超过10分钟(推荐严格单位检查) function isExceedTenMinutes(timestampA, timestampB) { // (1) 统一为毫秒单位(兼容PHP 10位时间戳) const convertToMilliseconds = ts => ts.toString().length === 10 ? ts * 1000 : ts; // (2) 获取时间差绝对值(避免顺序影响) const timeA = convertToMilliseconds(timestampA); const timeB = convertToMilliseconds(timestampB); const diff = Math.abs(timeB - timeA); // (3) 10分钟=600,000毫秒 return diff > 10 * 60 * 1000; // "超过"使用>,若需包含等于则改为>= } ``` --- ### 二、关键逻辑说明 1. **单位自动转换** - 自动检测10位秒级时间戳(如PHP生成)并转为毫秒 - 原生JavaScript时间戳保持13位毫秒级不变[^1] 2. **时间差计算** ```javascript // 示例调用(混合PHP和JS时间戳) const phpTimestamp = 1642471746; // PHP 10位秒级 const jsTimestamp = Date.now(); // JS 13位毫秒级 console.log(isExceedTenMinutes(phpTimestamp, jsTimestamp)); ``` 3. **边界条件处理** - `Math.abs()`确保正负无关性 - `>`与`>=`根据业务需求选择(严格超时或包含临界值) --- ### 三、常见问题解决方案 | 问题场景 | 处理方法 | |------------------------|--------------------------------------------------------------------------| | 时间戳来源混合(PHP/JS)| 使用`convertToMilliseconds`统一单位 | | 时区差异影响 | 时间戳本身为UTC,计算差值不受时区影响[^4] | | 浮点数精度问题 | 确保时间戳为整数(使用`parseInt()`处理字符串输入) | --- ### 四、扩展应用 ```javascript // 获取友好时间差提示(如"5分钟前") function getTimeDifference(start, end) { const diff = Math.abs(end - start); const minutes = Math.floor(diff / (1000 * 60)); return `${minutes} 分钟`; } // 定时检查(每30秒检测一次) setInterval(() => { const isExceeded = isExceedTenMinutes(startTime, Date.now()); if (isExceeded) console.log("已超时!"); }, 30_000); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值