乐乐养的兔子中有 N 头超级兔子(4<=N<=12,N 为偶数),为了提高它们的待遇,乐乐打
算给它们安装电话系统,以方便它们交流。
每个兔子正好有其他 3 个在畜棚里的朋友, 每个兔子占了 N 个排成一排的畜栏中的一
个。 一个长度为 L 的电线需要 L 单位的电线, 所以如果畜栏 4 和畜栏 7 的兔子为朋友, 那
么需要 3 个单位的电线来造一个电线将他们连在一起。
假设每对朋友必须用单独的电线连接, 那么当乐乐将它们按最优的方法排列后,最少
需要多少单位的电线。
输入格式:
第一行: 一个整数 N,兔子们,编号从 1 到 N。
第 2-1+N 行: 每一行包含三个用空格隔开的整数, 每个整数在 1-N 范围内。 第 i+1 行包
含了和第 i 号兔子朋友的三个朋友的编号。 如果第 i 个兔子和第 j 个兔子为朋友,那么第 j
个兔子也和第 i 个兔子为朋友。
输出格式:
第一行: 输出将所有对朋友兔子连接在一起最少需要多少单位的电线。
输入样例 (haywire.in) :
6
6 2 5
1 3 4
4 2 6
5 3 2
4 6 1
1 5 3
输出样例 (haywire.out) :
17
这题是真的秀...
本人表示只会暴力,考试打了个暴力,结果标程用个随机排列过了....
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define R register using namespace std; int pa[20]; int f[20][4]; int n;int ans=1000000; int w[20]; int main() { freopen("haywire.in","r",stdin); freopen("haywire.out","w",stdout); cin>>n; for(R int i=1;i<=n;i++) pa[i]=i; R int t; for(R int i=1;i<=n;i++) for(R int j=1;j<=3;j++) { cin>>t; if(t<i) f[i][++f[i][0]]=t; } R int sum; for(R int i=1;i<=250000;i++) { sum=0; random_shuffle(pa+1,pa+1+n); for(R int i=1;i<=n;i++) w[pa[i]]=i; for(R int i=1;i<=n;i++) for(R int j=1;j<=f[i][0];j++) sum+=abs(w[i]-w[f[i][j]]); if(sum<ans) ans=sum; } cout<<ans<<endl; return 0; }