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 }

 

posted @ 2017-04-18 22:03  橘生淮南终洛枳  阅读(152)  评论(0编辑  收藏  举报