您的位置:首页 > 编程语言 > C语言/C++

Vijos P1901 学姐的钱包

2016-11-24 19:13 267 查看


描述

学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.

可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.

好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.

其中第i位朋友说:

如果doc有不少于Ri元钱,

doc可以把手上所有的钱都给这位朋友,

并从这位朋友手中换回Vi元钱,

但是这次交换会浪费Ti的时间.

doc希望可以在最短的时间内换到M元钱(其实是可以大于M的, 因为doc可以存私房钱呢), 否则学姐会生气的!


格式

输入格式

输入数据第一行给定T, 表示总的询问次数.

对于每一次询问, 第一行给出两个整数N和M.

之后N行, 每一行给出三个整数Vi, Ri和Ti. (保证Ri<=Vi).

输出格式

对于每一次询问, 首先输出询问的编号, 参见样例输出.

之后输出最小需要的时间, 如果不可能完成目标, 则输出-1.


样例1

样例输入1[复制]

3
5 9
5 1 1
10 4 10
8 1 10
11 6 1
7 3 8
4 5
2 1 1
3 2 1
4 3 1
8 4 1
3 10
5 1 3
8 2 5
10 9 2


样例输出1[复制]

Case #1: 10
Case #2: 4
Case #3: -1



限制

对于40%的数据

N <= 1500.
对于100%的数据
T <= 5
1 <= N <= 100000.
1 <= M <= 1000000000.
1 <= Ri <= Vi <= 1000000000.

1 <= Ti <= 1000000000.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

离散化+SPFA~

学的王神的做法,真是神奇啊~

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long

int T,n,m,c[1000001],tot,fi[1000001],ne[1000001],w[1000001],v[1000001],cnt,totnumcnt;
ll dis[1000001],maxx;
bool b[1000001];
queue<ll> q;

struct node{
int v,r,t;
}a[100001];

void add(ll u,ll vv,ll val)
{
w[++cnt]=vv;v[cnt]=val;ne[cnt]=fi[u];fi[u]=cnt;
}

void findd()
{
memset(dis,127,sizeof(dis));
maxx=dis[0];
q.push(1);b[1]=1;dis[1]=0;
while(!q.empty())
{
int k=q.front();q.pop();b[k]=0;
for(int i=fi[k];i;i=ne[i])
if(dis[w[i]]>dis[k]+v[i])
{
dis[w[i]]=dis[k]+v[i];
if(!b[w[i]])
{
b[w[i]]=1;q.push(w[i]);
}
}
}
}

int main()
{
scanf("%d",&T);
while(T--)
{
memset(fi,0,sizeof(fi));cnt=tot=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i)
{
scanf("%d%d%d",&a[i].v,&a[i].r,&a[i].t);
if(a[i].v>m) a[i].v=m;
if(a[i].r>m) a[i].r=m;
c[++tot]=a[i].v;
c[++tot]=a[i].r;
}
sort(c+1,c+tot+1);
tot=unique(c+1,c+tot+1)-c-1;
for(int i=1;i<=n;++i)
{
a[i].v=lower_bound(c+1,c+tot+1,a[i].v)-c;
a[i].r=lower_bound(c+1,c+tot+1,a[i].r)-c;
add(a[i].r,a[i].v,a[i].t);
}
for(int i=2;i<=tot;i++) add(i,i-1,0);findd();
printf("Case #%d: %lld\n",++totnumcnt,dis[tot]==maxx ? -1:dis[tot]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ SPFA 离散化