Pagini recente » Cod sursa (job #425996) | Cod sursa (job #665322) | Cod sursa (job #1833373) | Cod sursa (job #2678062) | Cod sursa (job #1143688)
#include<cstdio>
#include<queue>
#include<vector>
#define inf 1000000
#define NMax 1005
using namespace std;
int nrq[NMax],inq[NMax],N;
double d[NMax];
vector<pair<int,int> > vc[NMax];
queue<int> Q;
int BellmanFord (double minus)
{
int i,nxt,crt;
double dst;
for (i=1; i<=N; i++)
d[i]=inf, nrq[i]=0, inq[i]=0;
Q.push(0);
d[0]=0;
inq[0]=1;
nrq[0]++;
while (!Q.empty())
{
crt=Q.front();
Q.pop(), inq[crt]=0;
for (i=0; i<vc[crt].size(); i++)
{
nxt=vc[crt][i].first, dst=vc[crt][i].second;
if (crt) dst-=minus;
if (d[nxt]>=d[crt]+dst)
{
d[nxt]=d[crt]+dst;
if (!inq[nxt])
if (nrq[nxt]>N)
return 1;
else
{
Q.push(nxt);
nrq[nxt]++;
inq[nxt]=1;
}
}
}
}
return 0;
}
int main ()
{
int i,M,x,y,dd;
double st,dr,mid,sol;
freopen("ciclu.in","r",stdin);
freopen("ciclu.out","w",stdout);
scanf("%d%d",&N,&M);
for (i=1; i<=M; i++)
{
scanf("%d%d%d",&x,&y,&dd);
vc[x].push_back(make_pair(y,dd));
}
for (i=1; i<=N; i++)
vc[0].push_back(make_pair(i,0));
st=1, dr=1000;
while (st<dr)
{
mid=(st+dr)/2;
if (BellmanFord(mid))
sol=mid, dr=mid-0.1;
else
st=mid+0,1;
}
printf("%.2lf\n",sol);
}