ITPub博客

首页 > 大数据 > 数据分析 > 需要对节点 1 求 两次 dijkstra,怎么使得代码写的简洁?

需要对节点 1 求 两次 dijkstra,怎么使得代码写的简洁?

投稿 数据分析 作者:ecclw459 时间:2026-01-26 16:58:14 0 删除 编辑

using ED = array< int , 2 >; using GRAPH = vector<vector<ED>>; GRAPH tr (n + 1) ; GRAPH rtr (n + 1) ; ffp (i, 1 , m) { int u (q_), v (q_), w (q_) ; tr[u]. push_back ({ w,v }); //tr是树边,本人的习惯 rtr[v]. push_back ({ w,u }); //rtr是反图 } auto dij = [&]( int st, GRAPH& gp)->ll { priority_queue<ED, vector<ED>, greater<ED>>dui; vector< int > dis (n + 1 , iINF); dis[st] = 0 ; dui. push ({ 0 ,st }); while (dui. size ()) { auto [w, now] = dui. top (); dui. pop (); if (dis[now] < w) continue ; for ( auto [nxtw, nxt] : gp[now]) { if (nxtw + dis[now] >= dis[nxt]) continue ; dis[nxt] = nxtw + dis[now]; dui. push ({ nxtw + dis[now],nxt }); } } return accumulate (dis. begin () + 1 , dis. end (), 0ll );


类型别名:让代码更易读,明确数据的字节长度 # define u32 uint32_t   // 32位无符号整数(4字节) # define u16 uint16_t   // 16位无符号整数(2字节) # define f32 float     // 32位浮点数(4字节) # define i16 int16_t   // 16位有符号整数(2字节) # define HZ 44100       // 采样率:每秒采集44100个声音样本(标准音频采样率) # define DURATION 5     // 音频时长:5秒 // 1. 定义WAV的三个核心数据块结构(对应格式规范) // RIFF块:文件整体标识 struct chunk1 {     char ChunkID[ 4 ];   // 块标识,固定为"RIFF"    u32 ChunkSize;     // 从该字段到文件末尾的字节数(总字节数-8)     char Format[ 4 ];     // 格式类型,固定为"WAVE" }RIFF; // fmt块:音频参数配置 struct chunk2 {     char ChunkID[ 4 ];   // 块标识,固定为"fmt "(注意末尾有空格)    u16 Tag;           // 编码格式,1代表PCM(无压缩)    u32 ChunkSize;     // fmt块的大小,PCM格式固定为16    u16 Chnnels;       // 声道数:1=单声道,2=立体声    u32 SampleRate;     // 采样率    u32 ByteRate;       // 每秒数据量 = 采样率×声道数×位深/8    u16 BloclAlign;     // 每个采样的总字节数 = 声道数×位深/8    u16 BitsperSample; // 每个采样的位深:16位(常见) }Fmt; // data块:音频数据存储区 struct chunk3 {     char DataId[ 4 ];     // 块标识,固定为"data"    u32 DataSize;       // 音频数据的总字节数 }Data; signed main ( int argc, char* argv[]) {     // 打开文件:"wb"表示以二进制模式写入(关键!文件本质是二进制)    FILE *fp = fopen ( "test.wav" , "wb" );     // 计算总采样数:采样率×时长(5秒×44100=220500个样本)    u32 NumSamples = HZ * DURATION;     // 2. 填充RIFF块并写入文件     memcpy (RIFF.ChunkID, "RIFF" , 4 );           // 写入块标识    RIFF.ChunkSize = NumSamples* sizeof (u16)+ 36 ; // 计算块大小     memcpy (RIFF.Format, "WAVE" , 4 );           // 声明为WAVE格式     fwrite (RIFF.ChunkID, sizeof ( char ), 4 ,fp); // 写入4个字符的ChunkID     fwrite (&RIFF.ChunkSize, sizeof (u32), 1 ,fp); // 写入4字节的ChunkSize     fwrite (RIFF.Format, sizeof ( char ), 4 ,fp); // 写入4个字符的Format     // 3. 填充fmt块并写入文件     memcpy (Fmt.ChunkID, "fmt " , 4 );huluzhibo.cn    Fmt.ChunkSize = 16 ;           // PCM格式下fmt块固定16字节    Fmt.Tag = 1 ;                 // PCM无压缩编码    Fmt.Chnnels = 1 ;             // 单声道    Fmt.SampleRate = HZ;         // 44100Hz采样率    Fmt.ByteRate = HZ* sizeof (u16); // 每秒字节数:44100×2=88200    Fmt.BloclAlign = Fmt.Chnnels * sizeof (u16); // 每个采样2字节    Fmt.BitsperSample = 16 ;       // 16位位深     // 按顺序写入fmt块的所有参数(严格遵循格式规范)     fwrite (&Fmt.ChunkID, sizeof ( char ), 4 ,fp);     fwrite (&Fmt.ChunkSize, sizeof (u32), 1 ,fp);     fwrite (&Fmt.Tag, sizeof (u16), 1 ,fp);     fwrite (&Fmt.Chnnels, sizeof (u16), 1 ,fp);     fwrite (&Fmt.SampleRate, sizeof (u32), 1 ,fp);     fwrite (&Fmt.ByteRate, sizeof (u32), 1 ,fp);     fwrite (&Fmt.BloclAlign, sizeof (u16), 1 ,fp);     fwrite (&Fmt.BitsperSample, sizeof (u16), 1 ,fp);     // 4. 填充data块并写入文件     memcpy (Data.DataId, "data" , 4 );    Data.DataSize = NumSamples * sizeof (u16); // 音频数据总字节数     fwrite (&Data.DataId, sizeof ( char ), 4 ,fp);     fwrite (&Data.DataSize, sizeof (u32), 1 ,fp);     // 5. 生成音频数据并写入(440Hz正弦波,标准A调)     for ( int i= 0 ;i<NumSamples;i++){        f32 t = (f32)i/HZ; // 计算当前时间点(秒)         // 生成440Hz正弦波的数值(声音的本质是振动,正弦波模拟声波)        f32 y = sinf (t* 440.0f * 2.0f * 3.1415926f );         // 转换为16位整数(适配16位位深的音频)        i16 sample = (i16)(y*INT16_MAX);         // 写入单个音频样本(2字节)


curl -fsSL https://claude.ai/install.sh | bash ## Claude Code 配置 GLM Coding Plan curl -O "https://cdn.bigmodel.cn/install/claude_code_env.sh" && bash ./claude_code_env.sh ## 手动配置Claude-code export ANTHROPIC_BASE_URL= "https://codeyy.top" export ANTHROPIC_AUTH_TOKEN= "my_ANTHROPIC_AUTH_TOKEN" export ANTHROPIC_BASE_URL= " https://open.bigmodel.cn/api/anthropic" ttkqol.cn


from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser #这里是你的千问apikey os.environ[ "DASHSCOPE_API_KEY" ] = "apikey" model = ChatTongyi(model= "qwen-plus" ) prompt = ChatPromptTemplate.from_messages([     ( "system" , "你是一个精通{topic}的资深技术专家。" ),     ( "user" , "请用三句话解释一下什么是{concept}。" ) ]) output_parser = StrOutputParser() chain = prompt | model | output_parser #文本输出 response = chain.invoke({ "topic" : "Python" , "concept" : "列表" }) print (response) #分割 print ( "=" * 30 ) #流式输出 for chunk in chain.stream({ "topic" : "人工智能" , "concept" : "神经网络" }):



# 定义要请求的URL url = "https://" # 发送GET请求 response = requests.get(url) # 检查HTTP状态码 if response.status_code == 200:     print(f"请求成功!状态码: {response.status_code}")     # 打印响应内容的开头部分     print("响应内容前100个字符:", response.text[:100]) else:     print(f"请求失败!状态码: {response.status_code}")

使用  PythonRun 在线运行这段代码,结果如下:

请求成功!状态码: 200 响应内容前100个字符: <!doctype html><html><head><title>Example Domain</title><meta name="viewport" content="wid
from  langchain.prompts.example_selector  import  LengthBasedExampleSelector
from  langchain_core.output_parsers  import  StrOutputParser
from  langchain_openai  import  ChatOpenAI
import  os zhiboapp.com.cn
from  dotenv  import  load_dotenv
  
# 定义反义词任务的示例数据集(few-shot examples)
# 每个示例包含一个输入词(input)和对应的反义词(output)
examples  =  [
     { "input" :  "开心" ,  "output" :  "伤心" },
     { "input" :  "高" ,  "output" :  "矮" },
     { "input" :  "精力充沛" ,  "output" :  "没精打采" },
     { "input" :  "粗" ,  "output" :  "细" },
]
 
# 定义单个示例的格式模板
# 使用 {input} 和 {output} 作为占位符,用于后续填充具体值
example_prompt  =  PromptTemplate(
     input_variables = [ "input" ,  "output" ],   # 声明模板中使用的变量名
     template = "Input: {input}\nOutput: {output}" ,   # 示例的文本格式
)
 
# 创建一个基于长度的示例选择器(LengthBasedExampleSelector)
# 作用:根据输入提示的总长度动态选择最合适的示例数量,避免超出模型上下文限制
example_selector  =  LengthBasedExampleSelector(
     examples = examples,   # 提供所有候选示例
     example_prompt = example_prompt,   # 用于格式化每个示例的模板
     max_length = 25 ,   # 设定整个 prompt(含前缀、示例、后缀)的最大 token 长度(此处为字符数近似)
     # 注意:LengthBasedExampleSelector 默认使用 len(text) 计算长度(非精确 token 数),适用于简单场景
)
 
# 构建动态少样本提示模板(FewShotPromptTemplate)
# 它会根据输入内容的长度,自动从 examples 中选择合适数量的示例插入到 prompt 中
dynamic_prompt  =  FewShotPromptTemplate(
     example_selector = example_selector,   # 使用上面定义的动态选择器(而非固定示例列表)
     example_prompt = example_prompt,       # 单个示例的格式
     prefix = "给出每个输入的反义词" ,        # 提示的开头部分(任务指令)
     suffix = "Input: {adjective}\nOutput:" ,   # 提示的结尾部分,包含待预测的输入占位符
     input_variables = [ "adjective" ],       # 声明最终用户输入的变量名(与 suffix 中的 {adjective} 对应)
)
 
# === 测试 1:输入较短,应选择多个示例 ===
print ( "【测试1】输入较短,选择多个示例:" )
print (dynamic_prompt. format (adjective = "big" ))
 
print ( 'ttzb.tw.cn------------' )
 
# === 测试 2:输入很长,应只选择少量或一个示例以控制总长度 ===
long_string  =  "big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else"
print ( "【测试2】输入很长,仅选择一个示例:" )
print (dynamic_prompt. format (adjective = long_string))
 
print ( '------------' )
 
# === 测试 3:动态添加新示例 ===
# 向示例选择器中新增一个示例("胖" -> "瘦")
new_example  =  { "input" :  "胖" ,  "output" :  "瘦" }
dynamic_prompt.example_selector.add_example(new_example)
print ( "【测试3】添加新示例后,查询'热情':" )
print (dynamic_prompt. format (adjective = "热情" ))
 
print ( '------------' )
 
# === 配置并调用 DeepSeek 大语言模型 ===
 
llm  =  ChatOpenAI(
     api_key = os.getenv( "DEEPSEEK_API_KEY" ),
     base_url = os.getenv( "DEEP_URL" ),   # Deepseek 的 API 基础地址
     model = "deepseek-v3:671b" ,   # Deepseek 对话模型(可选:deepseek-chat-pro 等高级模型)
     temperature = 0.7 ,   # 温度参数(0-1,越低越稳定)
     max_tokens = 1024   # 最大生成 tokens remenzhibo.com
)
 
# 创建字符串输出解析器,用于将模型返回的 AIMessage 转换为纯文本
output_parser  =  StrOutputParser()
 
# 构建处理链(Chain):prompt → LLM → output parser
# 使用 LangChain 的管道操作符 `|` 连接各组件
chain  =  dynamic_prompt | llm | output_parser
 
# 调用链,传入输入变量 {"adjective": "热情"}
# 注意:chain.invoke() 内部已包含 llm 调用和 output_parser 解析,无需再手动调用 output_parser
message  =  chain.invoke({ "adjective" :  "热情" })nbczhibo.com
 
# ⚠️ 注意:上一行 `chain.invoke()` 已经返回了字符串(因为最后是 StrOutputParser)
# 所以下面这行是多余的,甚至会导致错误(因为 message 已是 str,不能再次 invoke)
# result = output_parser.invoke(message)  # ❌ 错误:message 是 str,不是 AIMessage
 
# 正确做法:直接使用 message 作为结果
result  =  message  ftzhibo.com
 
print ( '###############' )
print ( "【模型输出】" )
print (result)

输出结果:

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
【测试 1 】输入较短,选择多个示例:
给出每个输入的反义词
 
Input : 开心
Output: 伤心
 
Input : 高
Output: 矮
 
Input : 精力充沛
Output: 没精打采
 
Input : 粗
Output: 细
 
Input : big
Output:
- - - - - - - - - - - -
【测试 2 】输入很长,仅选择一个示例:
给出每个输入的反义词
 
Input : 开心
Output: 伤心
 
Input : big  and  huge  and  massive  and  large  and  gigantic  and  tall  and  much much much much much bigger than everything  else
Output:livesoccerzb.cn
- - - - - - - - - - - -
【测试 3 】添加新示例后,查询 '热情' :
给出每个输入的反义词
 
Input : 开心
Output: 伤心
 
Input : 高
Output: 矮
 
Input : 精力充沛
Output: 没精打采
 
Input : 粗
Output: 细
 
Input : 胖
Output: 瘦
 
Input : 热情



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3109002/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-01-07

  • 博文量
    108
  • 访问量
    102113