HDU 2923 Einbahnstrasse (最短路,3级)

F - Einbahnstrasse
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Appoint description: 

Description

Einbahnstra   e (German for a one-way street) is a street on which vehicles should only move in one direction. One reason for having one-way streets is to facilitate a smoother flow of traffic through crowded areas. This is useful in city centers, especially old cities like Cairo and Damascus. Careful planning guarantees that you can get to any location starting from any point. Nevertheless, drivers must carefully plan their route in order to avoid prolonging their trip due to one-way streets. Experienced drivers know that there are multiple paths to travel between any two locations. Not only that, there might be multiple roads between the same two locations. Knowing the shortest way between any two locations is a must! This is even more important when driving vehicles that are hard to maneuver (garbage trucks, towing trucks, etc.)

You just started a new job at a car-towing company. The company has a number of towing trucks parked at the company's garage. A tow-truck lifts the front or back wheels of a broken car in order to pull it straight back to the company's garage. You receive calls from various parts of the city about broken cars that need to be towed. The cars have to be towed in the same order as you receive the calls. Your job is to advise the tow-truck drivers regarding the shortest way in order to collect all broken cars back in to the company's garage. At the end of the day, you have to report to the management the total distance traveled by the trucks.
 

Input

Your program will be tested on one or more test cases. The first line of each test case specifies three numbers (N , C , and R ) separated by one or more spaces. The city has N locations with distinct names, including the company's garage. C is the number of broken cars. R is the number of roads in the city. Note that 0 < N < 100 , 0<=C < 1000 , and R < 10000 . The second line is made of C + 1 words, the first being the location of the company's garage, and the rest being the locations of the broken cars. A location is a word made of 10 letters or less. Letter case is significant. After the second line, there will be exactly R lines, each describing a road. A road is described using one of these three formats:


A -v -> B
A <-v - B
A <-v -> B


A and B are names of two different locations, while v is a positive integer (not exceeding 1000) denoting the length of the road. The first format specifies a one-way street from location A to B , the second specifies a one-way street from B to A , while the last specifies a two-way street between them. A , ``the arrow", and B are separated by one or more spaces. The end of the test cases is specified with a line having three zeros (for N , C , and R .)

The test case in the example below is the same as the one in the figure. 

 

Output

For each test case, print the total distance traveled using the following format:


k . V


Where k is test case number (starting at 1,) is a space, and V is the result.
 

Sample Input

     
     
4 2 5 NewTroy Midvale Metrodale NewTroy <-20-> Midvale Midvale --50-> Bakerline NewTroy <-5-- Bakerline Metrodale <-30-> NewTroy Metrodale --5-> Bakerline 0 0 0
 

Sample Output

     
     
1. 80
 

思路:比较水的全源最短路,结果就是每次拖车+一次正反最短路就可以了。

坑:有重边,同一地点有多辆broken car

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<queue>
#include<map>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define clr(f,z) memset(f,z,sizeof(f))
#define ll(x) (1<<x)
using namespace std;
const int msize=1009;
const int oo=0x3f3f3f3f;
map<string,int>mp;
class Edge
{
  public:int v,w,next;
};
class Short_Path
{
public:
  int dis[msize][msize];
  bool vis[msize];
  int n,m,edge,head[msize];
  Edge e[msize*msize];
  int car[msize];
  void clear()
  { clr(car,0);
    FOR(i,0,n)FOR(j,0,n)dis[i][j]=oo;
    edge=0;clr(head,-1);
  }
  void add(int u,int v,int w)
  {
    e[edge].v=v;e[edge].w=w;e[edge].next=head[u];head[u]=edge++;
  }
  void SPFA()
  {
    int u,v;
    clr(vis,0);
    FOR(t,0,n)
    {
      dis[t][t]=0;
      queue<int>Q;
      Q.push(t);
      while(!Q.empty())
      {
        u=Q.front();Q.pop();vis[u]=0;
        for(int i=head[u];~i;i=e[i].next)
        {
          v=e[i].v;
          if(dis[t][v]>dis[t][u]+e[i].w)
          {
            dis[t][v]=dis[t][u]+e[i].w;
            if(!vis[v])
            {
              Q.push(v);vis[v]=1;
            }
          }
        }
      }
    }
  }
  int get(int&x)
  {
    char z;x=0;
    int w;
    int num=0;
    while(1)
    {
      if(num)scanf("-%d-",&w);
      z=getchar();
      if(z=='<')x|=2,++num;
      if(z=='>')x|=1,++num;
      if(z=='-')++num;
      if(num==2)return w;
    }
  }
  void getans()
  { int ans=0;
    FOR(i,1,m)
    {
      ans+=car[i]*(dis[0][i]+dis[i][0]);
    }
    printf("%d\n",ans);
  }
}sp;
int main()
{ int a,b,c,p,pos;
  string ss;int cas=0;
  while(~scanf("%d%d%d",&sp.n,&sp.m,&p))
  { if(sp.n==0&&sp.m==0&&p==0)break;
    sp.clear();mp.clear();
    pos=0;
    FOR(i,0,sp.m)
    {
      cin>>ss;
      if(mp[ss]==0)
      mp[ss]=++pos;
      ++sp.car[ mp[ss]-1 ];
    }
    int t;
    FOR(i,1,p)
    {
      cin>>ss;
      if(mp[ss]==0)mp[ss]=++pos;
      a=mp[ss]-1;
      c=sp.get(t);
      cin>>ss;
      if(mp[ss]==0)mp[ss]=++pos;
      b=mp[ss]-1;
      if(t&1)sp.add(a,b,c);
      if(t&2)sp.add(b,a,c);
    }
    sp.SPFA();
    printf("%d. ",++cas);
    sp.getans();
  }
}





### LlamaIndex 多模态 RAG 实现 LlamaIndex 支持多种数据类型的接入与处理,这使得它成为构建多模态检索增强生成(RAG)系统的理想选择[^1]。为了实现这一目标,LlamaIndex 结合了不同种类的数据连接器、索引机制以及强大的查询引擎。 #### 数据连接器支持多样化输入源 对于多模态数据的支持始于数据收集阶段。LlamaIndex 的数据连接器可以从多个异构资源中提取信息,包括但不限于APIs、PDF文档、SQL数据库等。这意味着无论是文本还是多媒体文件中的内容都可以被纳入到后续的分析流程之中。 #### 统一化的中间表示形式 一旦获取到了原始资料之后,下一步就是创建统一而高效的内部表达方式——即所谓的“中间表示”。这种转换不仅简化了下游任务的操作难度,同时也提高了整个系统的性能表现。尤其当面对复杂场景下的混合型数据集时,良好的设计尤为关键。 #### 查询引擎助力跨媒体理解能力 借助于内置的强大搜索引擎组件,用户可以通过自然语言提问的形式轻松获得所需答案;而对于更复杂的交互需求,则提供了专门定制版聊天机器人服务作为补充选项之一。更重要的是,在这里实现了真正的语义级关联匹配逻辑,从而让计算机具备了一定程度上的‘认知’功能去理解和回应人类意图背后所蕴含的意义所在。 #### 应用实例展示 考虑到实际应用场景的需求多样性,下面给出一段Python代码示例来说明如何利用LlamaIndex搭建一个多模态RAG系统: ```python from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext from langchain.llms.base import BaseLLM import os def create_multi_modal_rag_system(): documents = SimpleDirectoryReader(input_dir='./data').load_data() llm_predictor = LLMPredictor(llm=BaseLLM()) # 假设已经定义好了具体的大型预训练模型 service_context = ServiceContext.from_defaults( chunk_size_limit=None, prompt_helper=PromptHelper(max_input_size=-1), llm_predictor=llm_predictor ) index = GPTSimpleVectorIndex(documents, service_context=service_context) query_engine = index.as_query_engine(similarity_top_k=2) response = query_engine.query("请描述一下图片里的人物表情特征") print(response) ``` 此段脚本展示了从加载本地目录下各类格式文件开始直到最终完成一次基于相似度排序后的top-k条目返回全过程。值得注意的是,“query”方法接收字符串参数代表使用者想要询问的内容,而在后台则会自动调用相应的解析模块并结合先前准备好的知识库来进行推理计算得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值