当初第一次做的是FPLICE这个题,当时就觉得要用图论去搜索,但是当时陷入死思维就是 dp[][]两个维度都是点,这样就违背了题目的本意,题目给定了一个时间T,在不超过时间T的情况下求最小的消耗,这不就是背包嘛。。。即拿T做容量,在图上面 设置 dp[i][j]表示i点的时候 j时间的最小消耗。

这样走一遍spfa就可以了。也有人把这个叫做 分层图最短路。。。好高端的样子啊

FPOLICE

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 110
#define INF 1<<30
using namespace std;
int dp[N][];
int mat[N][N],risk[N][N];
int inq[N][];
int n,T;
struct node
{
int i,t;
};
void bfs()
{
queue <node> q;
q.push((node){,});
memset(inq,,sizeof inq);
dp[][]=;
while (!q.empty())
{
node cur=q.front();
inq[cur.i][cur.t]=;
q.pop();
for (int i=;i<n;i++)if (cur.i!=i){
if (cur.t+mat[cur.i][i]>T) continue;
int nt=cur.t+mat[cur.i][i];
if (dp[i][nt]>dp[cur.i][cur.t]+risk[cur.i][i]){
dp[i][nt]=dp[cur.i][cur.t]+risk[cur.i][i];
if (!inq[i][nt]){
q.push((node){i,nt});
inq[i][nt]=;
}
}
}
}
int ansT=-,ansR=INF;
for (int i=;i<=T;i++){
if (dp[n-][i]<ansR){
ansR=dp[n-][i];
ansT=i;
}
}
if (ansT<) puts("-1");
else printf("%d %d\n",ansR,ansT);
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&T);
for (int i=;i<n;i++){
for (int j=;j<n;j++){
scanf("%d",&mat[i][j]);
}
for (int j=;j<T+;j++)
dp[i][j]=INF;
}
for (int i=;i<n;i++)
for (int j=;j<n;j++){
scanf("%d",&risk[i][j]);
}
bfs();
}
return ;
}

FISHER

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define INF 1<<30
using namespace std;
struct node{
int x,T;
};
int dp[][];
int maT[][],maF[][];
int n,t;
int inq[][];
void spfa()
{
memset(inq,,sizeof inq);
queue <node> q;
q.push((node){,});
dp[][]=;
while (!q.empty())
{
node u=q.front();q.pop();
inq[u.x][u.T]=;
for (int v=;v<n;v++){
if (v==u.x) continue;
int tot=u.T+maT[u.x][v];
if (tot>t) continue;
if (dp[v][tot]>dp[u.x][u.T]+maF[u.x][v]){
dp[v][tot]=dp[u.x][u.T]+maF[u.x][v];
if (!inq[v][tot]){
q.push((node){v,tot});
inq[v][tot]=;
}
}
}
}
}
int main()
{
while (scanf("%d%d",&n,&t) && n)
{
for (int i=;i<n;i++)
for (int j=;j<n;j++) scanf("%d",&maT[i][j]);
for (int i=;i<n;i++)
for (int j=;j<n;j++) scanf("%d",&maF[i][j]);
for (int i=;i<=n;i++){
for (int j=;j<=t+;j++) dp[i][j]=INF;
}
spfa();
int ans=INF,loc=;
for (int i=;i<=t;i++){
if (ans>dp[n-][i]){
ans=dp[n-][i];
loc=i;
}
}
printf("%d %d\n",ans,loc);
}
return ;
}

SPOJ FISHER + FPOLICE SPFA+背包的更多相关文章

  1. In Action(SPFA+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. 【8.31校内测试】【找规律二分】【DP】【背包+spfa】

    打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16.. ...

  3. hdu6007 spfa+完全背包

    题意:给你M,N,K,代表你有M点法力值,N个物品,K个制造方式 接下来N行,如果以1开头则代表既能卖又能合成,0代表只能卖. 然后K行,每行第一个数是要合成的东西,第二个数代表有几对,每对第一个数是 ...

  4. SPOJ 181 - Scuba diver 二维背包

    潜水员要潜水,给出n个气缸(1<=n<=1000),每个气缸中有氧气量为ti,氮气量为ai,气缸重量为wi(1<=ti<=21,1<=ai<=79,1<=wi ...

  5. HDU 6007 Mr. Panda and Crystal (背包+spfa)

    题意:你生活在一个魔法大陆上,你有n 魔力, 这个大陆上有m 种魔法水晶,还有n 种合成水晶的方式,每种水晶价格告诉你,并且告诉你哪些水晶你能直接造出来,哪些你必须合成才能造出来,问你n魔力最多能卖多 ...

  6. SPOJ RENT 01背包的活用+二分

    这个题目给定N航班的发出时间和结束时间以及价值,要求不冲突时间的最大价值 第一时间想到经典的N方DP,即对航班按发出时间排一下序之后每个i对前面的都扫一遍 时间过不了N有10万,只能想优化了,一开始想 ...

  7. SPOJ:Decreasing Number of Visible Box(不错的,背包?贪心?)

    Shadowman loves to collect box but his roommates woogieman and itman don't like box and so shadowman ...

  8. hdu3339 In Action(Dijkstra+01背包)

    /* 题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用 坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit dis ...

  9. nyoj 203 三国志(最短路加01背包)

    三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...

随机推荐

  1. SciPy 图像处理

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  2. mysql 安装完以后没有mysql服务

    用管理员身份打开命令控制台(cmd),然后将mysql的安装文件的路径打开(bin文件的路径),然后再路径下打上mysqld.exe -install, 会出现提示  Service successf ...

  3. 学习Linux系统永远都不晚

    作为一名机械专业毕业的学生,两年的工作经历实实在在地教会了我如何认清现实,让当初那个对机械行业无比憧憬的少年明白了自己选择的路有多艰难.由于我的父母都是工人,所以我比其他同龄人能更早地接触到工业的魅力 ...

  4. MinGW 安装与简单实例

    MinGW的下载 链接: https://pan.baidu.com/s/1JiZoyFHUWoeaxCQcUXCKgg 密码: myh3 MinGW的安装 基本上都是按提示的点击下一步操作 接下来修 ...

  5. tp5日志分表

    /** * 记录网站日志 * * @return bool */ public function record() { // 组装数据 $log = self::$param; $log[self:: ...

  6. Python 日志模块详解

    前言 我们知道查看日志是开发人员日常获取信息.排查异常.发现问题的最好途径,日志记录中通常会标记有异常产生的原因.发生时间.具体错误行数等信息,这极大的节省了我们的排查时间,无形中提高了编码效率.所以 ...

  7. [题解] UVA11426 GCD - Extreme (II)

    题面 莫反是不可能莫反的,这辈子都不可能莫反了 题目要求的是 \[ \sum\limits_{i=1}^n \sum\limits_{j=i+1}^n \gcd(i,j) \] 稍微变个亚子 \[ \ ...

  8. LeetCode160 相交链表(双指针)

    题目: click here!!题目传送门 思路: 1.笨方法 因为如果两个链表相交的话,从相交的地方往后是同一条链表,所以: 分别遍历两个链表,得出两个链表的长度,两个长度做差得到n,然后将长的链表 ...

  9. P1047 编程团体赛

    转跳点:

  10. JVM--a == (a = b)基于栈的解释器执行过程

    前言 在翻阅ConcurrentLinkedQueue的代码的时候,发现这样一段代码在JDK源码中总是出现. t != (t = tail) 原先总是以为这不就是 t != t ?很是纳闷,遂Demo ...