问题描述
ACM机场是一个本地机场,对于大多数人来说,机场不是他们的终点或起点,而是中转站。机场有一个规划图。到达的大门在机场的北边(相当于空格)。出发的大门在机场的南边(也相当于空格)。两个正对着的大门距离相当于大门间的距离。每一个到达的大门只对应一个城市。每一个出发的大门也是这样。乘客到达的大门对应他们的起始城市,而出发大门对应他们的目标城市。因为这个问题,我们只需考虑转机的乘客。
转机的乘客会产生机场的交通堵塞。我们已经知道某两个城市之间的平均客流量。用这些信息,有可能能降低交通堵塞。例如,Cx城到Cy城的客流量大,就可以将他们安排得很近,甚至是对位。
因为花园和商店无法穿越,所以到达门G1和出发们G3(见图)的距离为1+2=3。
你需要计算几个方案的客流指数。两个大门间的客流指数等于人数乘以距离。而总的客流指数就是所有门之间的客流指数之和。
转机的乘客会产生机场的交通堵塞。我们已经知道某两个城市之间的平均客流量。用这些信息,有可能能降低交通堵塞。例如,Cx城到Cy城的客流量大,就可以将他们安排得很近,甚至是对位。
因为花园和商店无法穿越,所以到达门G1和出发们G3(见图)的距离为1+2=3。
你需要计算几个方案的客流指数。两个大门间的客流指数等于人数乘以距离。而总的客流指数就是所有门之间的客流指数之和。

输入格式
输入文件有多组测试数据。
最后一组只有一个0。
每组测试数据的输入有两部分。先是客流数据,之后是机场布局。
数据开始时一个n(1<n<25),表示城市数。接下来n行,每行表示一个城市的数据,第i行先是一个整数,表示起始城市,再一个1到n的整数k,表示目标城市数,k对整数,每对描述一个目标城市,第一个数是城市编号j,然后是乘客数目(最多500)从i到j的人数。
机场布局部分包括1到20个方案。用一个0结束。
一个方案包括3行。第一行一个数表示编号,第二行是1-n的一个排列,描述到达门对应的城市的排列,第三行用同样的方式描述出发大门。
最后一组只有一个0。
每组测试数据的输入有两部分。先是客流数据,之后是机场布局。
数据开始时一个n(1<n<25),表示城市数。接下来n行,每行表示一个城市的数据,第i行先是一个整数,表示起始城市,再一个1到n的整数k,表示目标城市数,k对整数,每对描述一个目标城市,第一个数是城市编号j,然后是乘客数目(最多500)从i到j的人数。
机场布局部分包括1到20个方案。用一个0结束。
一个方案包括3行。第一行一个数表示编号,第二行是1-n的一个排列,描述到达门对应的城市的排列,第三行用同样的方式描述出发大门。
输出格式
对于每个测试数据,输出包括一个表格,表示方案编号和客流指数,按照客流指数升序输出。若客流指数相同,则编号小的排在前面。见样例。注意方案编号右对齐,而客流指数左对齐。(样例输出前面4个空格,后面9个空格,然后没有空格,详见未格式化的试题。
样例输入
3
1 2 2 10 3 15
2 1 3 10
3 2 1 12 2 20
1
1 2 3
2 3 1
2
2 3 1
3 2 1
0
2
1 1 2 100
2 1 1 200
1
1 2
1 2
2
1 2
2 1
0
0
1 2 2 10 3 15
2 1 3 10
3 2 1 12 2 20
1
1 2 3
2 3 1
2
2 3 1
3 2 1
0
2
1 1 2 100
2 1 1 200
1
1 2
1 2
2
1 2
2 1
0
0
样例输出
Configuration Load
2 119
1 122
Configuration Load
2 300
1 600
2 119
1 122
Configuration Load
2 300
1 600
这个最后的输出格式也是没谁了。感觉正确的代码都不符合他的描述(谁有清晰的解释可以告诉我,谢谢)。最后还是看其他博客主改的。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
vector<int>ve[30];
vector<int>::iterator it;
int city[60][2];
int abs(int x){
return x>0?x:-x;
}
struct node{
int id,val;
node(){
val=0;
}
};
bool cmp(node a,node b){
if(a.val==b.val) return a.id<b.id;
return a.val<b.val;
}
int main(){
int n;
while(cin>>n&&n){
for(int i=0;i<30;i++) ve[i].clear();
int start,num,t,m;
for(int i=1;i<=n;i++){
cin>>start>>num;
while(num--){
cin>>t>>m;
ve[start].push_back(t);
ve[start].push_back(m);
}
}
int id;
num=0;
node ans[25];
while(cin>>id&&id){
ans[num].id=id;
for(int i=0;i<2;i++){
for(int j=1;j<=n;j++){
cin>>t;
city[t+n*i][0]=i+1;
city[t+n*i][1]=j;
}
}
for(int i=1;i<=n;i++){
for(it=ve[i].begin();it!=ve[i].end();it++){
t=*it;
int sum=abs(city[i][0]-city[t+n][0])+abs(city[i][1]-city[t+n][1]);
it++;
ans[num].val+=sum*(*it);
}
}
num++;
}
cout<<"Configuration Load"<<endl;
sort(ans,ans+num,cmp);
for(int i=0;i<num;i++){
printf("%-4d%-9d\n",ans[i].id,ans[i].val);
}
}
return 0;
}