连通问题 1863(通用版) (2011-3-6 09:41)

本文介绍了一种高效的图遍历算法实现,并通过一个具体的例子展示了如何应用该算法解决实际问题。该算法能够快速找到图中节点之间的最优路径,特别适用于解决AC率较低的问题。

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

//算法相当好用,碰到题目转换一下就可以套用了,非常速度!

//基于此题早上两道AC率30%的题目就用了30分钟,相当happy~

#include<stdio.h>
#define inf 0x7FFFFFFF
#define M 101
int
 map[M][M];
int
 link[M];
int  
kz[M];
int
 main()
{

    int
 sum,count,n,m,i,j,a,b,c,min;
    while
(
scanf("%d%d",&m,&n)!=EOF && m){
        for
(
i=0;i<M;i++){
            for
(
j=0;j<M;j++){
                map[i][j]=inf;
            }

            kz[i]=1;
        }

        for
(
i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=map[b][a]=c;
            if
(
i==1){
                link[0]=a;
                kz[a]=0;
            }
        }

        count=1;
        sum=0;
        a=1;
        while
(
count<n && a<=m){
            min=inf;
            for
(
i=0;i<count;i++){
                    for
(
j=1;j<=n;j++){
                        if
(
kz[j] && map[link[i]][j]<min){
                            link[count]=j;    
                            min=map[link[i]][j];
                        }
                        }    
             }

             if
(
 min!=inf){
                  sum+=min;
                   kz[link[count]]=0;
                 count++;
             }

             a++;
            }

        if
(
count==n){
            printf("%d\n",sum);
        }
else{

            printf("?\n");
        }
        
    }

return
 0;
}

<think>根据日志,端口连通性测试成功(收到220欢迎消息),控制连接和登录认证都成功,甚至发送NOOP命令也得到了正常响应。但是后续操作(可能是NLST或CWD)超时,错误为WinError 10060(连接超时)。这表明在数据传输阶段出现问题,可能的原因包括: 1. 被动模式下的端口被防火墙阻止 2. 服务器返回的被动模式地址不可达(可能是服务器返回了内网IP) 3. 服务器在高延迟环境下响应过慢 解决方案: 1. 增加数据传输的超时时间 2. 检查被动模式返回的地址是否正确 3. 尝试主动模式 4. 使用更小的命令(如LIST当前目录)测试 修改后的代码将: - 在被动模式连接时显式设置更长的超时 - 捕获被动模式地址并打印(用于诊断) - 提供主动模式回退选项 - 使用更简单的命令(如PWD)测试数据传输 以下是增强版代码:</think>根据日志分析,虽然端口连通性和基础连接正常,但在数据传输阶段出现超时(WinError 10060)。这表明问题可能出在被动模式数据传输或防火墙拦截。以下是全面优化的解决方案: ```python import sys import socket import ssl from ftplib import FTP_TLS, error_perm, error_temp import logging import struct import telnetlib from contextlib import closing # 配置日志记录 logging.basicConfig(level=logging.DEBUG, format=&#39;%(asctime)s - %(levelname)s - %(message)s&#39;, handlers=[logging.FileHandler(&#39;ftp_debug.log&#39;), logging.StreamHandler()]) # 配置信息 ftphost = &#39;198.2.36.101&#39; ftpusername = &#39;Shanghai&#39; ftppassword = &#39;46>Z9fH_j#Y0&#39; def create_ssl_context(): """创建跳过证书验证的SSL上下文""" context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE context.set_ciphers(&#39;DEFAULT@SECLEVEL=1&#39;) return context def test_port_connectivity(host, port, timeout=5): """测试端口连通性""" try: with closing(socket.create_connection((host, port), timeout)) as sock: response = sock.recv(1024).decode(&#39;utf-8&#39;, &#39;ignore&#39;) return True, response.strip() except Exception as e: return False, str(e) def parse_pasv_response(response): """解析FTP被动模式响应""" try: parts = response.split(&#39;(&#39;)[-1].split(&#39;)&#39;)[0].split(&#39;,&#39;) ip = &#39;.&#39;.join(parts[:4]) port = int(parts[4]) * 256 + int(parts[5]) return ip, port except: return None, None def debug_ftp_listing(): """解决数据传输超时问题的增强版FTP连接""" logger = logging.getLogger(&#39;FTPDebug&#39;) logger.info(f"尝试连接到 {ftphost}:21...") # 测试端口连通性 port_test, port_msg = test_port_connectivity(ftphost, 21) if not port_test: logger.critical(f"端口测试失败: {port_msg}") sys.exit(1) logger.info(f"端口连通性测试成功: {port_msg}") # 连接参数 max_retries = 3 data_timeout = 30 # 数据传输超时时间 for attempt in range(1, max_retries + 1): ftp = None try: # 创建FTP连接 ftp = FTP_TLS(context=create_ssl_context()) ftp.set_debuglevel(2) # 开启详细调试输出 # 连接服务器 ftp.connect(ftphost, 21, timeout=15) logger.info("控制连接建立成功") # 登录认证 ftp.login(ftpusername, ftppassword) logger.info("登录认证成功") # 设置安全传输 ftp.prot_p() logger.info("安全传输通道已建立") # 模式选择(优先尝试被动模式) use_pasv = True if attempt == max_retries: # 最后一次尝试使用主动模式 use_pasv = False logger.warning("尝试主动模式作为最后手段") ftp.set_pasv(use_pasv) # 测试控制通道 logger.info("发送控制通道测试命令...") pwd_response = ftp.sendcmd("PWD") logger.info(f"当前工作目录: {pwd_response}") # 获取被动模式端口(如果使用被动模式) if use_pasv: logger.info("获取被动模式端口...") pasv_response = ftp.sendcmd("PASV") data_ip, data_port = parse_pasv_response(pasv_response) logger.info(f"被动模式数据连接: {data_ip}:{data_port}") # 测试数据端口连通性 port_test, _ = test_port_connectivity(data_ip, data_port, 10) if not port_test: logger.error("数据端口无法访问,可能被防火墙阻止") raise ConnectionError("数据端口阻塞") # 设置数据传输超时 ftp.sock.settimeout(data_timeout) # 尝试获取目录列表(使用短列表命令) try: logger.info("尝试LIST命令...") files = [] ftp.retrlines(&#39;LIST&#39;, files.append) logger.info(f"成功获取 {len(files)} 个文件/目录") if files: print("示例内容:", files[:3]) return True except (socket.timeout, error_temp) as e: logger.error(f"列表命令超时 [{attempt}/{max_retries}]: {str(e)}") # 尝试更简单的命令 logger.info("尝试STAT命令测试...") try: stat_response = ftp.sendcmd("STAT") logger.info(f"STAT响应: {stat_response}") except Exception as e: logger.error(f"STAT命令失败: {str(e)}") except socket.timeout as e: logger.error(f"操作超时 [{attempt}/{max_retries}]: {str(e)}") data_timeout += 10 # 增加超时时间 except Exception as e: logger.error(f"连接失败 [{attempt}/{max_retries}]: {str(e)}") finally: # 清理连接 if ftp: try: ftp.quit() except: pass # 最终诊断 logger.critical("网络诊断建议:") logger.critical("1. 检查服务器防火墙设置,确保开放数据端口范围") logger.critical("2. 使用Wireshark捕获网络包分析FTP协议交互") logger.critical("3. 尝试直接连接数据端口: telnet <数据IP> <数据端口>") logger.critical("4. 联系服务器管理员检查FTP服务配置") logger.critical("5. 考虑使用SFTP替代FTP进行文件传输") sys.exit("所有连接尝试均失败") if __name__ == "__main__": debug_ftp_listing() ``` ### 关键优化点: 1. **被动模式端口诊断**: ```python pasv_response = ftp.sendcmd("PASV") data_ip, data_port = parse_pasv_response(pasv_response) ``` 显式解析被动模式返回的IP和端口,并测试其连通性 2. **数据传输策略优化**: - 优先使用`LIST`替代`NLST`(更兼容) - 增加`STAT`命令测试(简单状态检查) - 逐步增加超时时间(30s → 40s → 50s) 3. **模式切换机制**: ```python if attempt == max_retries: # 最后一次尝试使用主动模式 use_pasv = False ``` 在被动模式失败后自动切换到主动模式 4. **详细调试输出**: ```python ftp.set_debuglevel(2) # 输出所有FTP协议交互 ``` 记录完整的FTP命令/响应序列用于分析 5. **数据端口连通性测试**: ```python port_test, _ = test_port_connectivity(data_ip, data_port, 10) ``` 专门测试被动模式返回的数据端口是否可达 ### 高级诊断步骤: 1. **被动模式端口分析**: ```bash # 手动获取被动模式端口 telnet 198.2.36.101 21 USER Shanghai PASS 46>Z9fH_j#Y0 PASV ``` 2. **数据端口连通性测试**: ```bash # 使用解析出的IP和端口测试 telnet <数据IP> <数据端口> ``` 3. **网络包分析**: - 使用Wireshark捕获FTP流量 - 过滤条件:`ftp or ftp-data` 4. **防火墙检查**: ```powershell # 检查Windows防火墙规则 Get-NetFirewallRule | Where-Object { $_.Direction -eq &#39;Inbound&#39; -and $_.Action -eq &#39;Block&#39; } | Format-Table Name, Enabled ``` 5. **备选方案测试**: ```python # 尝试SFTP连接 import pysftp with pysftp.Connection(ftphost, username=ftpusername, password=ftppassword) as sftp: print(sftp.listdir()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值