传送门
思路:dfs剪一下枝,竟然能过。
当前的大于最小值,88.
DFS做法

  if(sum>minnn)return ;
/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-02-15.18.22
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
vector<int>v[maxn];
int dp[maxn];
int G[201][201];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;
int vis[201][201];
int n;
int minnn=1e9;
int sum=0;
void dfs(int step) {if(sum>minnn)return ;if(step == n) {minnn = min(minnn, sum);return ;}for(int i = step + 1; i <= n; i++) {sum+=G[step][i];dfs(i);sum-=G[step][i];}
}
int main() {ios::sync_with_stdio(false);cin >> n;for(int i = 1; i <= n - 1; i++)for(int j = i + 1; j <= n; j++)cin >> G[i][j];dfs(1);cout<<minnn<<endl;return 0;
}

DP两种做法
dp[j]表示到j站时的最少租金,m[i]ji]表示i到j站的租金。

/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-02-16.13.35
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
int G[202][202];
int dp[maxn];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;
int n ;
int main() {ios::sync_with_stdio(false);memset(dp,INF,sizeof(dp));dp[1]=0;cin >> n;for(int i = 1; i <= n - 1; i++)for(int j = i + 1; j <= n; j++)cin >> G[i][j];for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)dp[j]=min(dp[j],dp[i] + G[i][j]);//横向  纵向cout<<dp[n]<<endl;return 0;
}

在这里 dp[i]表示到i站时的最少租金,G[j][i]表示j到i站的租金。

/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-02-16.13.35
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
int G[202][202];
int dp[maxn];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;
int n ;
int main() {ios::sync_with_stdio(false);memset(dp,INF,sizeof(dp));dp[1]=0;cin >> n;for(int i = 1; i <= n - 1; i++)for(int j = i + 1; j <= n; j++)cin >> G[i][j];for(int i=2;i<=n;i++)for(int j=1;j<=i;j++)dp[i]=min(dp[i],dp[j] + G[j][i]);//横向  纵向cout<<dp[n]<<endl;return 0;
}

floyd多源最短路

/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-03-09.33.52
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
const int N=201;
//vector<int>v[maxn];
int dp[maxn];
int g[N][N];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;///同dijk实现一样  可以解决负权问题
void floyd(int n){for(int k=1;k<=n;k++)for(int i=1;i<= n;i++)for(int j=1;j<=n;j++)g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
int main() {ios::sync_with_stdio(false);memset(g,0x3f,sizeof(g));int n;cin>>n;for(int i=1;i<=n;i++)g[i][i]=0;///初始化int u=1,v=1,w;int t=n*(n-1)/2;while(t--){cin>>w;if(v==n){++u;v=u;}g[u][++v]=w;}floyd(n);cout<<g[1][n]<<endl;return 0;
}

dijk

/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-01-21.20.40
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
vector<int>vt[maxn];
int w[maxn], v[maxn];
int dp[maxn];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;
struct edge {int v, w, next; ///这条边的下一边edge() {} ///构造函数edge(int _v, int _w, int _next) { ///构造函数v = _v;w = _w;next = _next;}
} e[maxn];
int head[maxn], size;
void init() {memset(head, -1, sizeof(head));size = 0;
}//
void insert(int u, int v, int w) {e[size] = edge(v, w, head[u]); ///u链接的第一条边head[u] = size++;
}
void insert2(int u, int v, int w) {///插入一个无向边insert(u, v, w);//insert(v, u, w);
}
int n, m;
int dis[maxn];
bool vis[maxn];
void dijkstra(int u) {memset(vis, 0, sizeof(vis));memset(dis, 0x3f, sizeof(dis));dis[u] = 0;for(int i = 0; i < n; i++) {int mind = 1e9,minj=-1;for(int j=1;j<=n;j++){if(!vis[j]&&dis[j]<mind){minj=j;mind=dis[j];}}if(minj==-1)return ;vis[minj]=1;for(int j=head[minj];~j;j=e[j].next){int v=e[j].v;int w=e[j].w;if(!vis[v]&&dis[v]>dis[minj]+w)dis[v]=dis[minj]+w;}}
}
int main() {ios::sync_with_stdio(false);init();int u=1, v=1, w;cin >>n;int t=n*(n-1)/2;while(t--) {cin >> w;if(v==n){u++;v=u;}insert2(u, ++v, w);}dijkstra(1);///必须指定源点。cout << dis[n]<<endl;return 0;
}

spfa

/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-10-02-20.59.50
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
vector<int>v[maxn];
int dp[maxn];
vector<int>G[maxn];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;///spfa///O(M+N)logN.
struct edge {///邻接表的链表实现int v, w, fail;///  这条边练的顶点编号  边权  这条边的下一条边在数组中的编号。edge() {}edge(int _v, int _w, int _fail) {v = _v;w = _w;fail = _fail;}
} e[maxn];
int head[maxn], len;///每一个点连出的第一条边
void init() { ///初始化memset(head, -1, sizeof(head));len = 0;///当前图中的边数
}
void add(int u, int v, int w) {///插入一条边/从连出的所有的边e[len] = edge(v, w, head[u]);/// 这条边练的顶点编号   head[u]当前连出第一条边。head[u] = len++;///修改为len++
}///图论模板多
void add2(int u, int v, int w) {add(u, v, w);//add(v, u, w);
}
int n, m;
int dis[maxn];
bool vis[maxn];
void spfa(int u) {memset(vis, 0, sizeof(vis));vis[u] = 1; ///判段结点是否在队列中memset(dis, 0x3f, sizeof(dis)); ///只会截取第一个字节dis[u] = 0;queue<int>q;q.push(u);while(!q.empty()) {u = q.front();q.pop();///1.23vis[u] = 0;for(int j = head[u]; ~j; j = e[j].fail) {///j=-1;int v = e[j].v;int w = e[j].w;if(dis[v] > dis[u] + w) {dis[v] = dis[u] + w;///松弛操作if(!vis[v]) {q.push(v);vis[v] = 1;}}}}
}
int main() {ios::sync_with_stdio(false);init();int u=1, v=1, w;cin >> n;int t=n*(n-1)/2;while(t--) {cin>> w;if(v==n){u++;v=u;}add2(u,++v, w);}spfa(1);cout << dis[n] << endl;return 0;
}

P1359 租用游艇 dfs/dp/floyd/dijk/spfa DAG(有向无环图)相关推荐

  1. 打印一种拓扑排序(假定给的是有向无环图时)DFS+栈

    一.定义: 在计算机科学领域,有向图的拓扑排序是其顶点的线性排序,使得对于从顶点u 到顶点v的每个有向边uv,u在排序中都在v之前. 例如,图形的顶点可以表示要执行的任务,并且边可以表示一个任务必须在 ...

  2. 【洛谷P1359租用游艇】

    洛谷P1359租用游艇 为什么想到dp: 比它小的点能转移到它 类似于数字三角形模型 类似于贪心,或者说无后效性,一旦前面某个点确定了最小值,那么后面对其无影响 思路:根据题意,只有小的点能转移到大的 ...

  3. bzoj 1179 抢掠计划atm (缩点+有向无环图DP)

    bzoj 1179 抢掠计划atm (缩点+有向无环图DP) 手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/ar ...

  4. 【学习笔记】有向无环图上的DP

    [学习笔记]有向无环图上的DP 手动博客搬家: 本文发表于20180716 10:49:04, 原地址https://blog.csdn.net/suncongbo/article/details/8 ...

  5. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  6. 图——深度优先遍历(DFS)实现有向无环图的逆拓扑排序

    对图的深度遍历与对树的深度遍历思想类似,采用的是递归函数的办法. 如果是非连通图,则DFS遍历所有顶点即可. //Graph 图 //vertex 顶点,用一个int型变量表示//返回有向图G中顶点v ...

  7. P1359 租用游艇【Floyd】

    为什么我想讲Floyd算法呢? 因为我觉得 我自己掌握的不太好 码量很少 好,让我们回顾一下Floyd算法 Floyd算法 Floyd算法(Floyd-Warshall algorithm)又称为弗洛 ...

  8. P1359 租用游艇 洛谷

    https://www.luogu.org/problem/show?pid=1359 题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,-,n.游客可在这些游艇出租站租用游艇,并在下游的 ...

  9. 洛谷 P1359 租用游艇

    题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,-,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1& ...

  10. P1359 租用游艇 和 P2910 [USACO08OPEN]Clear And Present Danger S

    题目描述 长江游艇俱乐部在长江上设置了 nn 个游艇出租站 1,2,\cdots,n1,2,⋯,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站 ii 到游艇出租站 ...

最新文章

  1. 分布式存储系统考虑因素-分区容错性
  2. SCL+Devtoolset 安装与使用笔记
  3. springmvc教程--快速入门教程
  4. 最大匹配 人员分配[邻接矩阵]
  5. ssh根据姓名查询的时候报错java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
  6. 11-6渐变的用途和设定技巧
  7. JavaScript集成开发环境介绍
  8. python中冒号的语法错误_找不出python的语法错误该如何解决?
  9. 安装 Linux双系统
  10. SeSe 2005-02-11 -- 2005-02-12
  11. 基于matlab的简易诊断系统,基于matlab的图像识别
  12. 微信小程序开发工具基本介绍入门级(备忘)
  13. C++使用librdkafka创建消费者和生产者
  14. 新大陆NVH200条码扫描枪使用及设置教程
  15. 项目管理中风险控制的策略
  16. gdb x 命令详解
  17. 在本地计算机无法启动t6,启动用友T6时出现“不能登录到服务器[]请检查T6管理服务是否已启动。...
  18. 0基础24岁女硕士生,想转行做月薪30k的测试开发,需要从什么开始学习?
  19. 英文金曲大赛c语言,英文歌曲_最激情!佐治亚理工开学典礼欢迎辞_沪江英语
  20. 手机控制电脑之手机端模拟鼠标移动

热门文章

  1. win10系统通过WSL/WSL2安装各种linux版本,开启图形桌面
  2. NOD32杀毒软件升级ID
  3. 和计算机相关的英文名字女孩,简单好听寓意好的英文名字女孩
  4. 终极解决苹果开发者中心Edit Phone Number
  5. python数学公式编辑工具_Karl的良心佳软推荐 篇二:目前最好用的数学公式编辑神器——Mathpix Snipping Tool...
  6. datepicker的具体用法
  7. 简单工厂模式在Logback源码以及JDK源码中的应用
  8. linux下chm制作工具,在Linux上安装CHM查看工具
  9. javaIO体系图(2015年9月15日)
  10. cv2.VideoWriter生成视频无法播放的原因(持续补充)