ACM-售货员难题
输入
村庄数n和各村之间的路程(均是整数)。
输出
最短的路程
样例输入
3 {村庄数}
0 2 1 {村庄1到各村的路程}
1 0 2 {村庄2到各村的路程}
2 1 0 {村庄3到各村的路程}
样例输出
3 思路:就是DFS,但是减枝比较麻烦,还可以用DP。 这种写法超时!!!
// 售货员的难题.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std; const int MAX = ;
int n, ans, vis[MAX], map[MAX][MAX]; void DFS(int pos, int sum, int cnt)
{
//cout << "pos:" << pos << "\tsum:" << sum << "\tcnt:" << cnt << endl;
if (cnt == n)
{
//cout << "===========end============:" << "sum:" << sum << "\tans:" << ans << endl;
sum += map[pos][];
ans = min(sum, ans);
return;
}
if (sum > ans) return;
for (int i = ; i < n; i++)
{
if (!vis[i])
{
if (sum + map[pos][i] > ans) continue;
vis[i] = ;
DFS(i, sum + map[pos][i], cnt + );
vis[i] = ; }
} } int main()
{
memset(vis, , sizeof(vis));
memset(map, , sizeof(map));
ans = 0x3f3f3f3f; string str;
cin >> n;
getline(cin, str);
for (int i = ; i < n; i++)
{
for (int j = ; j < n; j++)
cin >> map[i][j];
getline(cin, str); } vis[] = ;
DFS(, ,); cout << ans << endl; return ;
}
预处理一下就好了。
#include<iostream>
#include<cstdio>
using namespace std;
int n, g[][], r[][], f[], ans = 0x7fffffff;
void Dfs(int now, int sum, int dis)
{
if (dis + r[now][] >= ans)return; //如果最小距离仍然大于最优解,直接减枝
if (dis>ans)return;
if (sum == n)
{
ans = min(ans, dis + g[now][]);
return;
}
for (int i = ; i <= n; i++)
if (f[i] == )
{
f[i] = ; Dfs(i, sum + , dis + g[now][i]); f[i] = ;
}
}
int main()
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
scanf("%d", &g[i][j]), r[i][j] = g[i][j];
for (int k = ; k <= n; k++)
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
r[i][j] = min(r[i][j], r[i][k] + r[j][k]); //计算两点之间的最小距离
f[] = ;
Dfs(, , );
printf("%d\n", ans);
return ;
}
ACM-售货员难题的更多相关文章
- ACM:统计难题 解题报告-字典树(Trie树)
统计难题 Time Limit:2000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Submit Status ...
- [swustoj 411] 售货员的难题
售货员的难题(0411) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 1744 Accepted: 200 Description ...
- [ACM] hdu 1251 统计难题 (字典树)
统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单 ...
- P1171 售货员的难题
P1171 售货员的难题 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0< ...
- codevs 2596 售货员的难题
2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货 ...
- 洛谷P1171 售货员的难题
P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...
- codevs2596 售货员的难题(状压dp)
2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15 ...
- 洛谷 P1171 售货员的难题
P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...
- [LSGDOJ 1505]售货员的难题 状压DP
题目描述 某 乡有n个村庄(1<n<15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村 到B村与B村到A村的路大多不同.为了提高 ...
- P1171 售货员的难题--搜索(剪枝)
题目背景 数据有更改 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0<s ...
随机推荐
- 设计模式---JDK动态代理和CGLIB代理
Cglig代理设计模式 /*测试类*/ package cglibProxy; import org.junit.Test; public class TestCglib { @Test public ...
- Java 代码空间复杂度查看工具
SourceMonitor 下载地址:http://www.campwoodsw.com/sourcemonitor.html
- Windows驱动开发-派遣函数
一个简单的派遣函数格式 NTSTATUS DispatchFunction(PDEVICE_OBJECT pDeviceObject, PIRP pIrp) { //业务代码区 //设置返回状态 pI ...
- mycat 主从复制,读写分离,
1.mycat 主从复制 https://blog.csdn.net/qq_35992900/article/details/80599976 2.mycat 读写分离 https://blog.cs ...
- django+celery+ RabbitMQ实现异步任务实例
背景 django要是针对上传文件等需要异步操作的场景时,celery是一个非常不错的选择.笔者的项目就是使用了这个组合,这里就做一个备忘吧. 安装RabbitMQ 这个安装及使用我已经在前一 ...
- IOS UIKIT_EXTERN, __attribute__((visibility ("default"))) 是啥玩意?
问题提出 在学习IOS时候,碰到一个函数NSStringFromCGPoint (UIGeometry.h) 其原型是 UIKIT_EXTERN NSString *NSStringFromCGPoi ...
- WPF学员管理系统
下载
- k-近邻算法的优缺点及拓展思考
//2019.08.03晚#k-近邻算法的拓展思考与总结1.k-近邻算法是一种非常典型的分类监督学习算法,它可以解决多分类的问题:另外,它的整体思想简单,效果强大.它也可以用来解决回归问题,使用的库函 ...
- HiBench成长笔记——(7) 阅读《The HiBench Benchmark Suite: Characterization of the MapReduce-Based Data Analysis》
<The HiBench Benchmark Suite: Characterization of the MapReduce-Based Data Analysis>内容精选 We th ...
- 1 初识JVM