Pagini recente » Istoria paginii runda/return_of_the_troll/clasament | Cod sursa (job #311921) | Istoria paginii runda/duminica_10/clasament | Istoria paginii runda/bravo_2/clasament | Cod sursa (job #389920)
Cod sursa(job #389920)
#include<cstdio>
#include<vector>
#include<cmath>
#include<climits>
#define baz 0.000000001
#define INF (double)INT_MAX
#define db 104659
using namespace std;
const int N=2501,M=1000001;
int n,m,s[N],q[M],p,var[N],u;
double c[N];
bool viz[N];
struct xy{
int to;
double c;
};
vector <xy> v[N];
void read()
{
int x,y,z;
xy a;
scanf("%d%d",&n,&m);
for( int i=1 ; i<=m ; ++i )
{
scanf("%d%d%d",&x,&y,&z);
a.c=log10((double)z);
a.to=y;
v[x].push_back(a);
++s[x];
a.to=x;
v[y].push_back(a);
++s[y];
}
}
void ini()
{
for( int i=2 ; i<=n ; ++i )
c[i]=INF;
}
void check( int x )
{
for( int i=0 ; i<s[x] ; ++i )
if( c[x]+v[x][i].c < c[v[x][i].to] )
{
c[v[x][i].to]=c[x]+v[x][i].c;
q[++u]=v[x][i].to;
}
}
void bf()
{
p=1;
u=1;
q[1]=1;
while(p<=u)
{
check(q[p]);
++p;
}
}
inline double mod( double x )
{
if( x<0 )
return -x;
return x;
}
void apel( int x )
{
viz[x]=1;
for( int i=0 ; i<s[x] ; ++i )
if( mod( c[ v[x][i].to ] + v[x][i].c - c[x] ) <= baz )
{
if( viz[v[x][i].to]==0 )
apel( v[x][i].to );
var[x]+=var[v[x][i].to];
if(var[x]>db)
var[x]-=db;
}
}
void solve()
{
ini();
bf();
var[1]=1;
viz[1]=1;
for( int i=2 ; i<=n ; ++i )
if(viz[i]==0)
apel(i);
}
void print()
{
for( int i=2 ; i<=n ; ++i )
printf("%d ",var[i]);
}
int main()
{
freopen("dmin.in","r",stdin);
freopen("dmin.out","w",stdout);
read();
solve();
print();
return 0;
}