• 186. [USACO Oct08] 牧场旅行


     186. [USACO Oct08] 牧场旅行

                输入文件:pwalk.in   输出文件:pwalk.out   简单对比

    时间限制:1 s   内存限制:128 MB

    n个被自然地编号为1..n奶牛(1<=n<=1000)正在同样被方便的编号为1..n的n个牧场中吃草。更加自然而方便的是,第i个奶牛就在第i个牧场中吃草。

    其中的一些对牧场被总共的n-1条双向通道的一条连接。奶牛可以通过通道。第i条通道连接的两个牧场是A_i和B_i(1<=A_i<=N;1<=B_i<=N)其长度是L_i(1<=L_i<=10000)。

    通道只会连接两个不同的牧场,所以这些通道使得整个牧场构成了一棵树。

    奶牛们是好交际的希望能够经常的访问别的奶牛。急切地,它们希望你能通过告诉它们Q(1<=Q<=1000)对牧场的路径来帮助他们安排旅行。(这里将有Q个询问,p1,p2(1<=p1<=n;1<=p1<=n))

    分数:200

    问题名称:pwalk

    输入格式:

    第1行:两个用空格隔开的整数:n和Q

    第2..n行:第i+1行包含三个用空格隔开的整数:A_i,B_i和L_i

    第n+1..N+Q行:每行包含两个用空格隔开的整数,代表两个不同的牧场,p1和p2

    输入样例(file pwalk.in):

    4 2

    2 1 2

    4 3 2

    1 4 3

    1 2

    3 2

    输出格式:

    第1..Q行:行i包含第i个询问的答案。

    输出样例:

    2

    7

    输出说明:

    询问1:牧场1和牧场2的路径长度为2。 询问2:3->4->1->2;总长为7。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 
     7 const long MAXN=9999;
     8 const long maxn=0x7fffffff;
     9 
    10 bool visit[MAXN];
    11 long dis[MAXN],n,m,u,v,len,t,a,e;
    12 long head[MAXN],num_edge;
    13 queue<int>que;
    14 
    15 struct Edge{
    16     long pre;
    17     long to;
    18     long len;
    19 }edge[MAXN];
    20 
    21 void in(){
    22     num_edge=0;
    23     for(long i=1;i<=m;i++)    {
    24         cin>>u>>v>>len;
    25         edge[++num_edge].pre=head[u];
    26         edge[num_edge].to=v;
    27         edge[num_edge].len=len;
    28         head[u]=num_edge;
    29         swap(u,v);
    30         edge[++num_edge].pre=head[u];
    31         edge[num_edge].to=v;
    32         edge[num_edge].len=len;
    33         head[u]=num_edge;
    34     }
    35 }
    36 
    37 void spfa(){
    38     memset(visit,false,sizeof(visit));
    39     fill(dis,dis+MAXN,maxn);
    40     dis[a]=0;
    41     visit[a]=true;
    42     que.push(a); 
    43     while(!que.empty()){
    44         long k=que.front();
    45         que.pop();
    46         visit[k]=false;
    47         for(long j=head[k];j!=-1;j=edge[j].pre){
    48             long w=edge[j].len;
    49             if(dis[edge[j].to]>dis[k]+w){
    50                 dis[edge[j].to]=dis[k]+w;
    51                 if(!visit[edge[j].to]){
    52                     visit[edge[j].to]=true;
    53                     que.push(edge[j].to);
    54                 }
    55             }
    56         }
    57     }
    58     cout<<dis[e]<<endl;
    59 }
    60 
    61 int main(){
    62     freopen("pwalk.in","r",stdin);
    63     freopen("pwalk.out","w",stdout);
    64     memset(head,-1,sizeof(head));
    65     cin>>n>>t;
    66     m=n-1;
    67     in();
    68     for(int i=1;i<=t;i++){
    69           cin>>a>>e;
    70           spfa();
    71       }
    72     fclose(stdin);
    73     fclose(stdout);
    74     return 0;
    75 }
  • 相关阅读:
    数据结构:关于重建二叉树的三种思路
    操作系统:进程调度算法详解之FCFS和SPF篇
    Java反射机制浅析
    数据挖掘:基于TF-IDF算法的数据集选取优化
    RC隔离 更新where条件列 没有索引的情况
    RR区间锁 不是唯一索引,即使区间内没值,也锁
    If one session has a shared or exclusive lock on record R in an index, another session cannot insert
    RR模式下利用区间锁防止幻读,RC模式没有区间锁会出现幻读
    使用next-key locks 用于搜索和索引扫描,可以防止幻读
    Gap Locks 区间锁
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/6730798.html
Copyright © 2020-2023  润新知