P2210 Haywire

题目描述

Farmer John有N只奶牛,(4 <= N <= 12,其中N是偶数).

他们建立了一套原生的系统,使得奶牛与他的朋友可以通过由干草保护的线路来进行对话交流.

每一头奶牛在这个牧场中正好有3个朋友,并且他们必须把自己安排在一排干草堆中.

一条长L的线路要占用刚好N堆干草来保护线路.

比如说,如果有两头奶牛分别在草堆4与草堆7中,并且他们是朋友关系,那么我们就需要用3堆干草来建造线路,使他们之间能够联系.

假设每一对作为朋友的奶牛都必须用一条单独的线来连接,并且我们可以随便地改变奶牛的位置,请计算出我们建造线路所需要的最少的干草堆.

输入输出格式

输入格式:

第1行:一个整数N. 为了方便,我们给奶牛用1~N的数字进行编号.

第2..1+N: 每一行都有三个在1~N中的整数. 第i+1行的数字代表着第i头奶牛的三个朋友的编号。显然,如果奶牛i是奶牛j的三个朋友之一,那么奶牛j也是奶牛i的三个朋友之一.

输出格式:

一个整数,代表着建造线路需要的干草堆数量的最小值.

输入输出样例

输入样例#1: 复制

6
6 2 5
1 3 4
4 2 6
5 3 2
4 6 1
1 5 3
输出样例#1: 复制

17

说明

样例解释: 奶牛最好的排列是6, 5, 1, 4, 2, 3, 这个时候我们只需要17个单位的干草堆.

#include<bits/stdc++.h>

#define N 20

using namespace std;
int n,m,ans,cnt;
int a[N],vis[N],dis[N][N],fri[N][]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(x=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline int abs_(int a){return a<?-a:a;} void calc()
{
static int pos[N];
for(int i=;i<=n;i++) pos[a[i]]=i;
int tot=;memset(dis,,sizeof dis);
for(int i=;i<=n;i++) for(int j=;j<=;j++)
{
if(dis[i][fri[i][j]] || dis[fri[i][j]][i]) continue;
dis[i][fri[i][j]]=dis[fri[i][j]][i]=;tot+=abs_(pos[i]-pos[fri[i][j]]);
}ans=min(ans,tot);
} void dfs(int k)
{
for(int i=;i<=n;i++)
{
if(!vis[i])
{
vis[i]=;a[k]=i;
if(k==n) calc();
dfs(k+);
vis[i]=;
}
}
} int main()
{
//freopen("ly.in","r",stdin);
n=read();
for(int i=;i<=n;i++) for(int j=;j<=;j++)
fri[i][j]=read();
ans=0x3f3f3f3f;dfs();
printf("%d\n",ans);
return ;
}

49暴力dfs

/*
nowtot:当前总距离;
links:已经访问的所有奶牛中,有多少路线没有找到,(即某奶牛的朋友还没有找到);
remain:已经访问的所有奶牛中,没有找到的路线的长度总和,(是当前,并不是所有);
因为每条路线至少是1,所以我们假定所有没找到的路线开始都为1; 每次,remain+links,即当前位置,还没有找到的所有路线都+1(显然);
因此remain是我们的方案的下限,即最小的估值(不可能更小了); 其实,这只是个“随机”值,但这个随机值不会让答案错误;
*/
#include<bits/stdc++.h> #define N 20 using namespace std; int fr[N][],a[N],pos[N];
int n,ans,cnt;
bool vis[N]; void dfs(int x,int nowtot,int links,int remain)
{ if(x==n+) ans=min(ans,nowtot);
if(remain+nowtot >= ans) return;//最优化剪枝 for(int i=;i<=n;i++)
{
if(!pos[i])
{
int new_link=,sum=;//每个奶牛开始有三个朋友;
pos[i]=x;//第i个奶牛放在x上;
for(int j=;j<=;j++)
{
if(pos[fr[i][j]]!=)
{
sum+=abs(x-pos[fr[i][j]]);//发现这条路线已经确定;
new_link-=;//friend路线-1,当前奶牛同样-1,总的减2;
}
}
dfs(x+,nowtot+sum,links+new_link,remain+(links+new_link)-sum);
pos[i]=;
}
}
return;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)for(int j=;j<=;j++)
scanf("%d",&fr[i][j]);
ans=0x3f3f3f3f; dfs(,,,);
printf("%d\n",ans);
return ;
}

P2210 Haywire(A*)的更多相关文章

  1. P2210 Haywire

    P2210 Haywire 模拟退火练手题 #include<cmath> #include<ctime> #include<cstdio> #include< ...

  2. [洛谷P2210]Haywire

    题目大意:有$n(n\leqslant12)$个数,每个数和其他三个数连边,求一个排列,使得边的长度最小 题解:状压$DP$,$f_{i,j}$表示当前确定的数状态为$i$,有$j$条边起点被确定终点 ...

  3. luogu P2210 Haywire

    [返回模拟退火略解] 题目描述 一数轴上有 nnn 个点,有 nnn 个环,求一种组合方案,使得所有边长度和最小. Solution 2210\text{Solution 2210}Solution  ...

  4. Luogu P2210 Haywire 题解

    其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法, ...

  5. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  6. Haywire

    还是模拟退火乱搞. 不过考虑记录一下在整个退火过程中的最优答案. 而不是只看最后剩下的解. 退火是一个随机算法,他有很大的几率能跳到最优解,但也很有可能从最优解跳出去. 所以要记录答案. Haywir ...

  7. 【LuoguP2210 USACO】 Haywire

    这种答案跟序列排列顺序有关的,n比较小的(稍微大一点的也可以),求最优解的,一般都可以随机化过 随机化不一定是模拟退火或是什么遗传蚁群 哪怕只是直接随机化一个序列,只要你随机的次数够多,它都能找到正解 ...

  8. 洛谷P2210题解

    题面 模拟退火练手好题. 对于这个题,一般有两种解法: 每次随机两个数交换. 每次直接打乱数组. 两个方法都可以过,我写了第一种,因为不想用stl. 代码

  9. jQ1.5源码注释以及解读RE

    jQ作为javascript的库( ▼-▼ ), 尽善尽美, 代码优美,  值得学习.  这一周平常上班没啥事也看jQ1.5的代码, 今天周六差不多看完了(Sizzle部分还没看), 重新看了一下, ...

随机推荐

  1. iOS-bug·Failed to connect to github-production-release-asset-2e65be.s3.amazonaws.com port 443: Operation time out

    在首次运行 react naticve 项目时, 遇到了如下的问题: Failed to connect to github-production-release-asset-2e65be.s3.am ...

  2. eclipse默认指定项目的编译器版本

    eclipse 提示 @Override must override a superclass method 问题解决 今天新换了一个Eclipse 版本: Build id: 20140224-06 ...

  3. jquery显示和隐藏元素

    1.$('#id').show()/$('#id').hide()/$('#id').toggle() 2.$('#id').css('display','none')/$('#id').css('d ...

  4. 对dispatch_async到主线程的逻辑封装成C/C++接口类型

    背景:代码里面有时候会把将要运行的内容放到主线程里面运行,但假设已经是主线程里面的代码调用dispatch_async的时候偶尔会出现crash,所以就须要推断是否已经在主线程里面了. 通常的做法类似 ...

  5. Office EXCEL 表格如何设置某个单元格是选择项,如何设置一级下拉菜单

    1 比如我要在C这一列都做成下拉菜单,则我选中这一列的第一个单元格,然后点击数据-有效性,然后把允许改成"序列",在来源中输入每一项(用逗号隔开),比如我一共要做四个下拉菜单选项, ...

  6. Android开发:怎样隐藏自己的app应用

    本文主要介绍怎样通过改动AndroidManifest.xml清单文件来达到隐藏自身应用的目的,不是隐藏第三方应用.为了不浪费大家时间.特此说明. 转载请注明作者xiong_it和链接:http:// ...

  7. Eclipse项目遇到问题汇总

    1:gc overhead limit exceeded     原因:这是由于项目中eclipse内存分配不足导致     修改:修改eclipse.ini文件     修改如下:          ...

  8. [NOI2018] 归程 可持久化并查集

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...

  9. order by 特殊排序技巧

    if object_id('tempdb..#temp') is not null drop table #temp ), col2 )) insert into #temp ' ' ' ' go - ...

  10. HDU4009 Transfer water —— 最小树形图 + 不定根 + 超级点

    题目链接:https://vjudge.net/problem/HDU-4009 Transfer water Time Limit: 5000/3000 MS (Java/Others)    Me ...