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))
问题名称:
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。
思路:
就是裸的spfa!!!
①90代码(弗洛伊德):
#include<iostream> #include<cstdio> #include<cstring> #define M 1005 using namespace std; int map[M][M]; int n,q,x,y,w; int main() { //freopen("pwalk.in","r",stdin); //freopen("pwalk.out","w",stdout); memset(map,10001,sizeof(map)); cin>>n>>q; for(int i=1;i<=n-1;i++) { scanf("%d%d%d",&x,&y,&w); map[x][y]=map[y][x]=w; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } for(int i=1;i<=q;i++) { scanf("%d%d",&x,&y); cout<<map[x][y]<<endl; } //fclose(stdin); //fclose(stdout); return 0; }
②改进后的代码(spfa):
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define MAXN 1001 #define maxn 0x7fffffff using namespace std; struct node { int u; int v; int w; int next; }edge[MAXN]; int head[MAXN],dis[MAXN]; int n,q,vis[MAXN],num=1; int spfa(int bg,int ed)//如题,裸的spfa { for(int i=1;i<=n;i++) dis[i]=maxn; memset(vis,0,sizeof(vis)); queue<int>q; q.push(bg); dis[bg]=0; vis[bg]=1; while(q.size()!=0) { int p=q.front(); q.pop(); for(int i=head[p];i!=-1;i=edge[i].next) { int to=edge[i].v; if(dis[to]>dis[p]+edge[i].w) { dis[to]=dis[p]+edge[i].w; if(vis[to]==0) { q.push(to); vis[to]=1; //必须要进行标记!!! } } } } return dis[ed]; } int main() { //freopen("pwalk.in","r",stdin); //freopen("pwalk.out","w",stdout); scanf("%d%d",&n,&q); for(int i=1;i<=n;i++)head[i]=-1;//进行初始化 for(int i=1;i<n;i++) { scanf("%d%d%d",&edge[num].u,&edge[num].v,&edge[num].w); edge[num].next=head[edge[num].u]; head[edge[num].u]=num++; edge[num].v=edge[num-1].u; edge[num].u=edge[num-1].v; edge[num].w=edge[num-1].w; edge[num].next=head[edge[num].u]; head[edge[num].u]=num++; } for(int i=1;i<=q;i++)//进行输出 { int bg; int ed; scanf("%d%d",&bg,&ed); printf("%d\n",spfa(bg,ed)); } return 0; }
- 186. [USACO Oct08] 牧场旅行
- 186. [USACO Oct08] 牧场旅行
- 186. [USACO Oct08] 牧场旅行
- 185.[USACO Oct08] 挖水井 (第三次考试大整理)
- 186. [USACO Oct08] 牧场旅行
- [NOIP2012] 同余方程(第三次考试大整理)
- 157. [USACO Nov07] 奶牛跨栏(第三次考试大整理)
- (转)网络工作室暑假后第三次培训资料(几种SQL分页的总结)整理
- 10-12考试整理
- 2018版OCP 11g 052最新考试题库整理(带答案)(14)
- 计算机4级考试信息整理
- 大四最后半年我要走遍全国!(节约型旅行信息整理大集合【转的】更新超级链接ing)
- 第三次JAVA基础考试总结
- 2018版OCP 11g 052最新考试题库整理(带答案)(15)