题目:葫芦
解析:
0/1分数规划
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int Max=2005;
const int Maxm=2010;
int n,m,size;
double l=0.0,r=1000.0,mid,dis[Max];
int first[Max];
bool vis[Max];
struct shu{int to,next,len;};
shu edge[Maxm<<1];
inline int get_int()
{
int x=0,f=1;
char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void build(int x,int y,int z)
{
edge[++size].next=first[x];
first[x]=size;
edge[size].to=y,edge[size].len=z;
}
inline bool check(double mid)
{
memset(dis,127,sizeof(dis));
queue<int>q;
q.push(1);dis[1]=0;
while(q.size())
{
int p=q.front();q.pop();vis[p]=0;
for(int u=first[p];u;u=edge[u].next)
{
int to=edge[u].to;
if(dis[to]>dis[p]+edge[u].len-mid)
{
dis[to]=dis[p]+edge[u].len-mid;
if(!vis[to]) q.push(to),vis[to]=1;
}
}
}
return dis[n]-mid>0;
}
signed main()
{
n=get_int(),m=get_int();
for(int i=1;i<=m;i++)
{
int x=get_int(),y=get_int(),z=get_int();
build(x,y,z);
}
for(int i=1;i<=40;i++)
{
mid=(l+r)/2.0;
if(check(mid)) l=mid;
else r=mid;
}
printf("%.5f",l);
return 0;
}