Pagini recente » Cod sursa (job #273582) | Cod sursa (job #2356171) | Cod sursa (job #616889) | Cod sursa (job #1648811) | Cod sursa (job #920026)
Cod sursa(job #920026)
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<utility>
#include<bitset>
#include<cmath>
#define INF 0x3f3f3f3f
#define NMAX 50005
#define PREC 0.000001
#define MOD 104659
#define eps 1e-10
#define TYPE pair<double,int>
FILE *f=fopen("dmin.in","r");
FILE *g=fopen("dmin.out","w");
using namespace std;
vector<pair <int,double> >G[NMAX];
vector<int>::iterator it;
int n,m;
double dist[NMAX];
int res[NMAX];
priority_queue<TYPE,vector<TYPE>,greater<TYPE> > HEAP;
bool used[NMAX];
void read( void )
{
fscanf(f,"%d%d",&n,&m);
for(int i(1); i <=m ; ++i )
{
int a,b;
double c;
fscanf(f,"%d%d%lf",&a,&b,&c);
c=log(c);
G[a].push_back(make_pair(b,c));
G[b].push_back(make_pair(a,c));
}
fclose(f);
}
void DIJKSTRA( void )
{
for(int i(1); i<=n ; dist[i++]=INF);
dist[1]=0;
res[1]=1;
HEAP.push(make_pair(0,1));
while(!HEAP.empty())
{
int node=HEAP.top().second;
HEAP.pop();
if( used[node])
continue;
used[node]=1;
for(int i(0); i <G[node].size(); ++i )
{
int newnode=G[node][i].first;
double dis=G[node][i].second;
if( dist[newnode] > dist[node]+dis + eps)
{
dist[newnode]=dist[node]+dis;
res[newnode]=res[node];
HEAP.push(make_pair(dist[newnode],newnode));
continue;
}
if( abs (dist[newnode] - dist[node]-dis ) <= eps )
{
res[newnode]+=res[node];
res[newnode]%=MOD;
continue;
}
}
}
}
void write( void )
{
for(int i(2); i <=n; ++i )
fprintf(g,"%d ",res[i]);
fclose(g);
}
int main( void )
{
read();
DIJKSTRA();
write();
return 0;
}