题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它。一个人从1号点出发,给出初始金钱,问你能不能访问所以的点,并且获得所以证书。

题解:目标是那些一定要访问的点,怎么到达的我们不关心,但是我们关心花费最少的路径,而且到达那个点后是一定要打工的,如果只是经过,那么在求花费最少的路径的时候已经考虑过了。

因此先用Folyd求出各个点直接的最短路径,由于N很小,又只要求出一个解,所以直接dfs暴搜就行了。

M很大,可能有重边。注意处理。

当时一看,图论题,没仔细想就跳过了。下面的代码加了输入挂,因为第一遍写T了,以为是输入问题,所以加上了。改了我好几个小时没过,重写一遍就过了。

#define HDU
#ifndef HDU
#include<bits/stdc++.h>
#else
//pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
//#include<iostream>
#endif // HDU
#define mins(s,x) if((x)<(s)) s = x
#define maxs(s,x) if((x)>(s)) s = x
using namespace std;
typedef long double ld;
typedef long long ll; const int maxn = ;
const int maxh = ;
const int INF = 0x3f3f3f3f; int N,M,Mon,H;
int dis[maxn][maxn];
inline void scan_d(int &ret)
{
char c;ret=;
while((c=getchar())<''||c>'');
while(c>=''&&c<='') ret=ret*+(c-''),c=getchar();
} struct City
{
int cost,earn,id;
void input(){
scanf("%d%d%d",&id,&earn,&cost);
}
}city[maxh]; bool vis[maxh]; bool dfs(int u,int money,int cnt)
{
if( cnt == H && money >= dis[u][] )return true;
for(int i = ; i < H; i++) if(!vis[i]){
int v = city[i].id;
if( money >= dis[u][v]+city[i].cost ){
vis[i] = ;
if(dfs(v,money-dis[u][v]-city[i].cost+city[i].earn,cnt+)) return true;
vis[i] = ;
}
}
return false;
} void init()
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
for(int i = ; i <= N; i++)
dis[i][i]= ;
} //#define local int main()
{
#ifdef local
freopen("in.txt","r",stdin);
// freopen("myout.txt","w",stdout);
#endif // local
int T;
scan_d(T);
//scanf("%d",&T);
while(T--){
scan_d(N);scan_d(M);scan_d(Mon);
//scanf("%d%d%d",&N,&M,&Mon);
init();
for(int i = ; i < M; i++){
int u,v,w;
scan_d(u);scan_d(v);scan_d(w);
//scanf("%d%d%d",&u,&v,&w);
//if(u == v) continue;
if(dis[u][v]>w) {
dis[u][v] = w;
dis[v][u] = dis[u][v];
} } for(int k = ; k <= N; k++)
for(int i = ; i <= N; i++){
if(dis[i][k]<INF)
for(int j = ; j <= N; j++) {
mins(dis[i][j],dis[i][k]+dis[k][j]);
}
} scanf("%d",&H);
for(int i = ; i < H; i++){
city[i].input();
} printf("%s\n",dfs(,Mon,)?"YES":"NO");
} return ;
}

HDU 4284 Travel (Folyd预处理+dfs暴搜)的更多相关文章

  1. HDU 4277 USACO ORZ(DFS暴搜+set去重)

    原题代号:HDU 4277 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277 原题描述: USACO ORZ Time Limit: 5000/1 ...

  2. hdu 4277 USACO ORZ (dfs暴搜+hash)

    题目大意:有N个木棒,相互组合拼接,能组成多少种不同的三角形. 思路:假设c>=b>=a 然后枚举C,在C的dfs里嵌套枚举B的DFS. #include <iostream> ...

  3. HDU 4284 Travel

    据说是TSP经典问题...可以用状态压缩做.但是看到数据量,就厚着脸皮上搜索了...先floyd预处理每对点间的最小消费,然后只考虑要去的城市就可以了,这样的话城市数最多16个...当时就暴搜了... ...

  4. Usaco 2.3 Zero Sums(回溯DFS)--暴搜

    Zero SumConsider the sequence of digits from 1 through N (where N=9) in increasing order: 1 2 3 ... ...

  5. hdu4848 DFS 暴搜+ 强剪枝

    题意:       给你一个图,然后问你从1出发遍历所有的点的距离和是多少,这里的距离和是每一个点到1的距离的总和,不是选择一条遍历所有点的路径的总长度,时间限制是 8000ms. 思路:       ...

  6. [HDU 5135] Little Zu Chongzhi's Triangles (dfs暴搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意:给你n条边,选出若干条边,组成若干个三角形,使得面积和最大.输出最大的面积和. 先将边 ...

  7. hdu 1426:Sudoku Killer(DFS深搜,进阶题目,求数独的解)

    Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. HDU - 4284 Travel(floyd+状压dp)

    Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roa ...

  9. hdu 4284 Travel(floyd + TSP)

    虽然题中有n<=100个点,但实际上你必须走过的点只有H<=15个.而且经过任意点但不消耗C[i]跟D[i]可以为无限次,所以可以floyd预处理出H个点的最短路,之后剩下的...就成了裸 ...

随机推荐

  1. 多进程小例子--fork+pipe

    1 #include<stdio.h>  2 #include<unistd.h>  3   4 #define m 6  5 int main()  6 {  7       ...

  2. POJ 1127 Jack Straws (线段相交)

    题意:给定一堆线段,然后有询问,问这两个线段是不是相交,并且如果间接相交也可以. 析:可以用并查集和线段相交来做,也可以用Floyd来做,相交就是一个模板题. 代码如下: #pragma commen ...

  3. 超级实用的Chrome插件

    1.JSON-handle:浏览器前台访问后台,后台返回json,它帮你格式化 2.Page Ruler:帮你测量页面上任何位置的长宽高 3. Momentum:打开新的tab页就像打开了一个新的世界 ...

  4. Working Experience - MoveWindow API 失败/无效

    写在前面 当然过程不可能这么顺风顺水,毕竟对 Win32 API 不熟悉,并且国内搜索引擎和博客质量较低(不误导你就算好了),最后还是通过 Google -> StackOverflow 找到答 ...

  5. Json文件转Excel

    先创建一个web项目,在根目录放置需要转换的json文件,直接读取静态Json文件加载数据进行转换,代码如下: string Json = string.Empty; List<object&g ...

  6. 60行代码实现一个迷你版Vue Router

    这是一个超级精简版的VueRouter,实现hash模式下,hash改变组件切换的功能,原理就是利用了 Vue.js 的响应式机制触发router-view组件的重新渲染. 代码 https://gi ...

  7. E20190420-hm

    impact n. 巨大影响; 强大作用; 撞击; 冲撞; 冲击力;      v. (对某事物) 有影响,有作用; 冲击; 撞击; incident  n. 发生的事情(尤指不寻常的或讨厌的); 严 ...

  8. JavaScript中两个数组的拼接

    方法一:使用for循环 var arr = ['tom', 'jerry']; var arr2 = [1, 2]; for(var i=0; i<arr2.length; i++){ arr. ...

  9. ue4 2游戏构架相关

    官网:游戏性指南 https://docs.unrealengine.com/latest/CHN/Gameplay/index.html 深入UE4剖析源码,浅出GameEngine设计理念,比较好 ...

  10. UGUI(七)界面拖动和焦点界面

    http://blog.sina.com.cn/s/blog_89d90b7c0102vj9e.html 一般软件和游戏有多窗口多界面时,都可以拖动子界面和排序子界面[点击后变成焦点界面显示在最前面] ...