Cod sursa(job #677587)

Utilizator torpedalaOltean Vlad torpedala Data 10 februarie 2012 12:53:41
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>


// int max=500001;
const int inf=1<<28;

FILE *in = fopen("dijkstra.in","r"), *out = fopen("dijkstra.out","w");

struct graf
{
	int nod,cost;
	graf *next;
	
};


graf *a[50001];
int n,m,d[50001],v[50001];




void add(int where, int nod, int cost)
{
	graf *q;
	q=new graf;
	q->nod=nod;
	q->cost=cost;
	q->next=a[where];
	a[where]=q;
	
}

void citire()
{
	 fscanf(in, "%d %d", &n, &m);

    int x, y, z;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d %d", &x, &y, &z);
        add(x, y, z);
    }
}


/*void afisare()
{
	for(int i=1; i<=n;i++)
	{
		graf *q=a[i];
		cout<<i<<": ";
		while(q)
		{
			cout<<q->nod<<", ";
			q=q->next;
		}
		cout<<endl;
	}
}
*/



void dijkstra()
{
	for(int i=2;i<=n;i++)
		d[i]=1<<30;
	
	int min, poz_min=0;
	
	
	for(int j=1;j<=n;j++)
	{
		min=1<<30;
		
	for(int i=1;i<=n;i++)
		if(d[i]<min&&!v[i])
		{
			min=d[i];
			poz_min=i;
		}
		
		v[poz_min]=1;
		
		graf *t;
		t=a[poz_min];
		
		while ( t )      
		{            
			if ( d[ t->nod ] > d[poz_min] + t->cost ) 
				d[ t->nod ] = d[poz_min] + t->cost;   
			
			t = t->next; 
   
		}
			
		
		
	}
	
	
}




int main()
{
	
	citire();
	dijkstra();
	
	 for ( int i = 2; i <= n; ++i )
        fprintf(out, "%d ", d[i] == inf ? 0 : d[i]);
    fprintf(out, "\n");

	
return 0;
}