Cod sursa(job #1132943)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 4 martie 2014 09:28:32
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <utility>
#include <queue>

using namespace std;

#define NMAX 1505
vector<pair<int,int> > graf[NMAX];
//long long int d[NMAX];
#define inf ((1ull<<61)-1)
vector<long long int> d(NMAX, inf);
long long int cate[NMAX];
bitset<NMAX> viz;
priority_queue<pair<int,int> > coada;
int n;

inline void dijkstra()
{
    //int i;
    //for(i=2;i<=n;i++)
    //    d[i]=inf;
    d[1]=0;

    coada.push(make_pair(0,1));
    cate[1]=1;

    pair<int,int> y;
    while(!coada.empty())
    {
        y=coada.top();
        coada.pop();
        //cout<<"s-a scos y="<<y.second<<endl;

        if(!viz[y.second])
        {
            //cout<<"ok"<<endl;
            //cout<<graf[y.ft].size()<<endl;
            viz[y.second]=1;
            for(vector<pair<int,int> >::iterator it=graf[y.second].begin();it!=graf[y.second].end();it++)
            {
           //     cout<<"bagam cu "<<it->first<<' '<<it->second<<endl;
                if(d[y.second]+it->second<d[it->first])
                {
                    d[it->first]=d[y.second]+it->second;
                    cate[it->first]=cate[y.second];
                    coada.push(make_pair(-d[it->first],it->first));
                }
                else if(d[y.second]+it->second==d[it->first])
                    cate[it->first]+=cate[y.second];
            }
        }
    }
}

int main()
{
    ifstream cin("dmin.in");
    ofstream cout("dmin.out");

    int i,m,a,b,c;
    cin>>n>>m;

    for(i=0;i<m;i++)
    {
        cin>>a>>b>>c;
        graf[a].push_back(make_pair(b,c));
        graf[b].push_back(make_pair(a,c));
    }

    dijkstra();

    if(n==1)
    {
        cout<<'\n';

        cin.close();
        cout.close();
        return 0;
    }

    cout<<cate[2];
    for(i=3;i<=n;i++)
        cout<<' '<<cate[i];
    cout<<'\n';

    cin.close();
    cout.close();
    return 0;
}