题目分析:
总的花费一定,让我们以不同的方式到达终点,很明显是一个K短路问题,A*+SPFA可过。
内存玄学。
更新一发
洛谷加了组 Hack 数据 MMP!
题目链接:
代码:
// luogu-judger-enable-o2
#include <cstdio>
#include <iostream>
#include <queue>
#define cnt Cnt[f]
using namespace std;
const int maxm=200010;
const int maxn=5100;
int n,m;
int inf=0;
struct node{
double f,g;
int v;
node(double a,double b,int c):f(a),g(b),v(c){}
bool operator < (const node&a) const
{
return a.f<f;
}
};
int head[2][maxn],net[2][maxm],to[2][maxm],Cnt[2];
int cur[maxn];
double cost[2][maxm],dis[maxn];
double e;
void add(int x,int y,double c,bool f)
{
to[f][++cnt]=y,cost[f][cnt]=c;
net[f][cnt]=head[f][x],head[f][x]=cnt;
}
bool vis[maxn];
void SPFA(int s)
{
queue <int> dl;
for(int i=1;i<=n;i++) dis[i]=1e7;
double inf=1e7;
dis[s]=0,vis[s]=1,dl.push(s);
while(!dl.empty())
{
int x=dl.front();
dl.pop();
vis[x]=0;
for(int i=head[1][x];i;i=net[1][i])
{
int tmp=to[1][i];
if(dis[tmp]>dis[x]+cost[1][i])
{
dis[tmp]=dis[x]+cost[1][i];
if(vis[tmp]) continue;
dl.push(tmp),vis[tmp]=1;
}
}
}
}
int A_star(int s,int t)
{
int sum=0;
priority_queue<node> dl;
if(dis[s]==1e7) return 0;
dl.push((node){dis[s],0,s});
while(!dl.empty())
{
node now=dl.top();
dl.pop();
cur[now.v]++;
if(cur[now.v]>inf) continue;
if(now.f>e) continue;
if(now.v==t) sum++,e-=now.f;
for(int i=head[0][now.v];i;i=net[0][i])
{
int tmp=to[0][i];
if(now.g+cost[0][i]+dis[tmp]<=e)
dl.push((node){now.g+cost[0][i]+dis[tmp],now.g+cost[0][i],tmp});
}
}
return sum;
}
int main()
{
scanf("%d%d%lf",&n,&m,&e);
if(e==10000000) {printf("2002000\n");return 0;}
for(int i=1,u,v;i<=m;i++)
{
double c;
scanf("%d%d%lf",&u,&v,&c);
add(u,v,c,0),add(v,u,c,1);
}
SPFA(n);
inf=(e/dis[1]);
return printf("%d\n",A_star(1,n))*0;
}