POJ3268基本的Dijkstra

#include <stdio.h>
#include <stdlib.h>

int M = 99999999;
int map[1002][1002];
int mapt[1002][1002];	// map transposed
int d[1002];
int dt[1002];

void Dijkstra(int v, int d[], int graph[][1002], int n);

int main()
{
    int n, edge, party;
    int i, j, u, v, cost;
    int max;
    
    scanf("%d %d %d", &n, &edge, &party);
    for(i=1; i<=n; i++)
    	for(j=1; j<=n; j++)
    	{
    		map[i][j] = M;
    		mapt[i][j] = M;
		}	
    		
    for(i=1; i<=edge; i++)
    {
		scanf("%d %d %d", &u, &v, &cost);
		map[u][v] = cost;
		mapt[v][u] = cost;
	}
    
	Dijkstra(party, d, map, n);
	Dijkstra(party, dt, mapt, n);
	
	max = 0;
	for(i=1; i<=n; i++)
	{
		if(d[i]+dt[i] > max)
			max = d[i]+dt[i];
	}
	printf("%d", max);
    
	system("pause");
	return 0;  
}

// v:source, d:distance, n:number of node
// Refer Introduction to algorithm
void Dijkstra(int v, int d[], int graph[][1002], int n)
{
	int i, j;
	int ss[1002]; // The Set S
	int min; // for implement min heap
	int u;
	
	// Initialize single source
	for (i=1; i<=n; i++)
	{
		d[i] = M;
		ss[i] = 0;
	}
	d[v] = 0;
	
	for (i=1; i<=n; i++)	// ensure run n times, actually n-1 times
	{
		// Get the d[min] from V-S=Q
		min = M;
		for (j=1; j<=n; j++)
		{
			if( (ss[j]==0) && (d[j]<min) )
			{
				min = d[j];
				u = j;
			}
		}
		ss[u] = 1; // Put u into Set S
		
		// Relaxation
		for (j=1; j<=n; j++)
		{
			if( d[u] + graph[u][j] < d[j] )
				d[j] = d[u] + graph[u][j];
		}
	}
}



参考:http://blog.sina.com.cn/s/blog_7b5b66e70100ttg3.html
http://blog.csdn.net/allenjy123/article/details/6003761 

你可能感兴趣的:(POJ3268基本的Dijkstra)