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 }