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个询问的答案。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int N=1001; 7 int map[N][N]; 8 int n,q; 9 const int maxn=999999; 10 int main() 11 { 12 freopen("pwalk.in","r",stdin); 13 freopen("pwalk.out","w",stdout); 14 scanf("%d%d",&n,&q); 15 memset(map,maxn,sizeof(map)); 16 for(int i=1;i<=n-1;i++) 17 { 18 int x,y,w; 19 scanf("%d%d%d",&x,&y,&w); 20 map[x][y]=w; 21 map[y][x]=w; 22 } 23 for(int k=1;k<=n;k++) 24 { 25 for(int i=1;i<=n;i++) 26 { 27 for(int j=1;j<=n;j++) 28 { 29 if(map[i][j]>map[i][k]+map[k][j]&&map[i][j]!=maxn) 30 { 31 map[i][j]=map[i][k]+map[k][j]; 32 } 33 } 34 } 35 } 36 for(int i=1;i<=q;i++) 37 { 38 int x,y; 39 scanf("%d%d",&x,&y); 40 printf("%d ",map[x][y]); 41 } 42 fclose(stdin); 43 fclose(stdout); 44 return 0; 45 }
输出样例:
2
7
输出说明:
询问1:牧场1和牧场2的路径长度为2。 询问2:3->4->1->2;总长为7。
错因:
freopen中stdin敲错;所以答案全为负数;
解题思路:弗洛伊德跑所有点
代码: