东大OJ1171题:ACMER的出行计划

Problem Description

众所周知,ACMER经常要到全国各地去参加各种比赛。

每当要出去比赛的时候,我们先要制定一个出行计划,比如说我们是坐飞机还是坐火车,从哪里坐到哪里等等。

现在给你一副路线图,请你制定一个合理的出行计划,由于经费有限,规定最多只能坐k次飞机。

Input

第一行给出一个T,表示有T组数据,之后每组数据第一行分别给出n,m,k(n为点数,分别编号为1-n。m为单向边数)

接下来的m行每行分别给出u,v,w,x(u和v分别为两端点编号,方向为u->v。w为费用。x为类型,0表示火车,1表示飞机)

最后一行给出s,e(s为起点,e为终点)

数据范围:1 <= T <= 10; 1 <= n <= 1000; 1 <= m <= 10000; 0 < k < 10; 1 <= u,v <= n; 1 <= w <= 10000。所有数据都为整数

Output

对于每组数据,输出一行最少费用。

Sample Input

1 4 4 1 1 2 1 1 2 4 1 1 1 3 1 0 3 4 2 0 1 4

Sample Output

3

Source

岑榕

Hint

No Hint!

带限制求最短路

仔细想想发现是dijkstra的时候把在struct里加上cur表示飞了cur次

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1007, maxm = 10007, INF = 2147483467;
int first[maxn], vis[maxn][12], dis[maxn][12];
int u[maxm], v[maxm], w[maxm], fly[maxm], next[maxm];
int n, m, k, s, e;
struct state
{
    int x, d, cur;
    state(){}
    state(int x, int d, int cur): x(x), d(d), cur(cur){}
    bool operator < (const state& WTF)const
    {
       return d > WTF.d;
    }
};
void ini()
{
    memset(vis, 0, sizeof(vis));
    memset(first, -1, sizeof(first));
    for(int i = 0; i <= n; i++)
        for(int j = 0; j < 12; j++)
            dis[i][j] = INF;
}

void dij()
{
    priority_queue<state> Q;
    dis[s][0] = 0;
    state ST(s, 0, 0);
    Q.push(ST);
    while(!Q.empty())
    {
        state y = Q.top();
        Q.pop();
        int x = y.x;
        int cur = y.cur;
        if(x == e)
            break;
        if(vis[x][cur])
            continue;
        vis[x][cur] = 1;
        for(int i = first[x]; ~i; i = next[i])
        {
            if(cur+fly[i] > k)
                continue;
            if(dis[v[i]][cur+fly[i]] > dis[x][cur] + w[i])
            {
                dis[v[i]][cur+fly[i]] = dis[x][cur] + w[i];
                Q.push(state(v[i], dis[v[i]][cur+fly[i]], cur+fly[i]));
            }
        }
    }
    int ans = INF;
    for(int i = 0; i <= k; i++)
        ans = min(ans, dis[e][i]);
    printf("%d\n", ans);
}

int main()
{
    //freopen("in.txt", "r", stdin);
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d%d", &n, &m, &k);
        ini();
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d%d%d", u+i, v+i, w+i, fly+i);
            next[i] = first[u[i]];
            first[u[i]] = i;
        }
        scanf("%d%d" ,&s, &e);
        dij();
    }
    return 0;
}

时间: 2024-10-01 02:30:54

东大OJ1171题:ACMER的出行计划的相关文章

题解:线性规划与网络流24题 T2 太空飞行计划问题

太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,-In}.实验Ej 需要用到的仪器是I的子集Rj ∈ I.配置仪器Ik的费用为ck美元.实验Ej 的赞助商已同意为该实验结果支付pj 美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收

LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,?,Em} E = \{ E_1, E_2, \cdots, E_m \}E={E?1??,E?2??,?,E?m??},和进行这些实验

【网络流24题】太空飞行计划

[问题描述]W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={ I1, I2,…,In }.实验Ej 需要用到的仪器是I的子集Rj∈I.配置仪器Ik 的费用为ck 美元.实验Ej 的赞助商已同意为该实验结果支付pj 美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收益是指

「网络流 24 题」太空飞行计划

OJ题号:洛谷2762.LOJ6001.CodeVS1233 题目大意: 有$n$个实验和$m$个仪器,每个实验需要依赖若干个仪器,不同实验可以共享一个仪器. 已知每一个实验$x$,有$p_x$的收益,每一个仪器$y$,有$c_y$的花费. 求最大净收益. 思路: 建立超级源汇$S$和$T$, 对于每一个实验$x$,连一条从$S$到$x$的容量为$p_x$的边: 对于每一个实验$x$对应的每一个仪器$y$,连一条从$x$到$y$的容量为$\infty$的边: 对于每一个仪器$y$连一条从$y$到

地铁出行计划

PSP 2.1 Personal Software Process Stages predict actual Planning 计划 0.5h 0.5h · Estimate · 估计这个任务需要多少时间 10h 9h Development 开发 9h 8h · Analysis · 需求分析 (包括学习新技术) 0.5h 0.5h · Design Spec · 生成设计文档 · Design Review · 设计复审 (和同事审核设计文档) · Coding Standard · 代码

刷题总结——太空飞行计划(最大权闭合子图用最大流解决)

题目: 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,-,Em},和进行这些实验需要使用的全部仪器的集合 I={I1, I2,-In}. 实验 Ej 需要用到的仪器是 I 的子集 Rj∈I.配置仪器 Ik 的费用为 Ck 美元.实验 Ej 的赞助商已同意为该实验结果支付 Pj 美元.W 教授的任务是找出一个有效算法, 确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的

网络流24题之太空飞行计划

题目大意: 有n个实验要做,做掉奖励相应的钱,但是每个实验需要相应的仪器,每个仪器启动起来要相应的钱,安排使得赚钱最多. 首先引入一个闭合图的概念. 闭合图就是原图的一个子图,如果一个点u在这个子图内,那么它连出去的所有点v也要在这个子图内. 最大权闭合图就是点的权值和最大的闭合图. 模型分析: 1.很明显这是一个二分图,每个实验向需要的仪器连有向边,实验的点权为正,仪器的点权为负,要求最大权闭合图. 2.这是一个选或不选的问题,所以可以转化成最小割的模型,把选的归为S集,不选的归为T集.但是要

OJ1171题 多个非数字只输出一个*的解决办法

#include<stdio.h>int main(){ char a[90], c; gets(a); for(c=0;a[c]!='\0';c++) { if(48<=a[c]&&57>=a[c]) { if(c>0) { if(a[c-1]=='*') { printf("*"); printf("%c", a[c]); } else printf("%c", a[c]); } else pri

【PowerOJ1737&amp;网络流24题】太空飞行计划问题(最小割)

题意: 思路: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef long double ld; 7 typedef pair<int,int> PII; 8 typedef pair<ll,ll> Pll; 9 typedef v