hrbustoj 2130 一笔画

基础状态压缩 转移方程为

 dp[j][i] = min(dp[j][i],dp[k][i^(1<<j)] + dis[k][j]);
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double dp[16][1<<16];
double x[16],y[16];
double dis[16][16];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i = 0;i < n;i++)
            scanf("%lf%lf",&x[i],&y[i]);
        for(int i = 0;i < n;i++)
            for(int j = 0;j < n;j++)
            dis[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));
        for(int i = 0;i < n;i++)
        {
            dp[i][0] = 0;
            for(int j = 1;j < (1<<n);j++)
                dp[i][j] = 99999999;
        }
        for(int i = 0;i < n;i++)
            dp[i][1<<i] = 0;
        for(int i = 0;i < (1<<n);i++)
        {
            for(int j = 0;j < n;j++)
            {
                for(int k = 0;k < n;k++)
                {
                    if( (1<<j)&i && (1<<k)&i && j != k)
                    dp[j][i] = min(dp[j][i],dp[k][i^(1<<j)] + dis[k][j]);
                }
            }
        }
        double Min = 99999999.0;
        for(int i = 0;i < n;i++)
        {
            if(dp[i][(1<<n) -1] < Min)
                Min = dp[i][(1<<n)-1];
        }
        printf("%.2lf\n",Min);
    }
    return 0;
}
时间: 2024-12-20 18:36:04

hrbustoj 2130 一笔画的相关文章

回路(一笔画问题)

回路(一笔画问题) 一.题目 回路 时间限制: 1 Sec  内存限制: 128 MB 提交: 0  解决: 0 [提交][状态][讨论版] 题目描述 给定一个由N行M列的'.'或者'*'的图形,'*'的格子无法路过,请使用一条回路去经过所有的'.'(必须回到起点,单点不算回路). 输入 第一行:N M(1 <= N <= 12, 1 <= M <= 12) 接下来N行,每行共有M个'.'或'*' 输出 一个正整数,表示满足条件的总条数,最后答案不会超过2^63 - 1. 样例输入

JAVA学习绘图颜色及其笔画属性设置字体显示文字

package com.graphics; import java.awt.*; import java.awt.geom.Rectangle2D; import java.util.Date; import javax.swing.*; /** * * @author biexiansheng * */ public class DrawString extends JFrame{ private Shape rect;//矩形对象 private Font font;//字体对象 priva

nyoj42 一笔画问题

题目链接 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径.若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路径但不具有欧拉回路的图称为半欧拉图. 先说一下欧拉路径.欧拉回路的充要条件: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度 4.有

一个Brushes笔画应用ios源码完整版

效果很不错的画笔App,提供几十种不同的画笔,包括毛笔画笔.拥有绘画App的一些基本功能,包括颜色选择.绘画保存,支持撤销(undo).重做(redo)以及橡皮擦功能等等,甚至还支持类似PhotoShop图层(layer)的功能(如第二张效果图).说明:应用的App Store地址:https://itunes.apple.com/app/id545366251.效果图: <ignore_js_op> <ignore_js_op> <ignore_js_op> <

一笔画问题

一笔画问题 如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路. 我们定义奇点是指跟这个点相连的边数目有奇数个的点.对于能够一笔画的图,我们有以下两个定理. 定理1:存在欧拉路的条件:图是连通的,有且只有2个奇点. 定理2:存在欧拉回路的条件:图是连通的,有0个奇点. 两个定理的正确性是显而易见的,既然每条边都要经过一次,那么对于欧拉路,除了起点和终点外,每个点如果进入了一次,显然一定要出去一次,显然是偶点.对于欧拉回路,每个点进入和出去次数一定都是相等的

NYOJ 42 一笔画

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数.每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P)随后的Q行,每行有两个正整数A,B(0<A,

Nyoj42 一笔画问题 (欧拉道路)

http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring> #define CLR(arr) memset(arr,0,sizeof(arr)) #define P 1001 int G[P],fa[P]; int find(int x){return x==fa[x]?x:x=find(fa[x]);} int main() {     int n,a,b

hdoj 3018 Ant Trip(无向图欧拉路||一笔画+并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 思路分析:题目可以看做一笔画问题,求最少画多少笔可以把所有的边画一次并且只画一次: 首先可以求出该无向图中连通图的个数,在每个无向连通图中求出需要画的笔数再相加即为所求.在一个无向连通图中,如果所有的点的度数为偶数则存在一个欧拉回路, 则只需要画一笔即可:如果图中存在度数为奇数的点,则需要画的笔数为度数为奇数的点的个数 /2:需要注意的孤立的点不需要画: 代码如下: #include <cst

一笔画问题x(www我会了好开心!!这次是有向图~)

考试的方面: (1)一笔画是怎样画的(水) (2)能否实现一笔画(小技巧) 1)必须连通(有向与无向都必须满足) 2)有向图:(欧拉回路)如果出度等于入度,可以从任意点搜索: (欧拉路)如果入度大于出度,则一定为终止点,而如果出度大于入度,则一定为开始的点(注意,如果入度与出度之间的差值大于一,则一定不能够形成欧拉路) 3)无向图:所有点的度数都为偶数时,才能实现欧拉回路||有两个点为奇数,且这两个点分别为起止点 一笔画性质: ■⒈凡是由偶点组成的连通图,一定可以一笔画成.画时可以把任一偶点为起