hdu 2066-dijkstra

有n个起点和m个终点,求出从家到火车站的最短的距离

dijkstra

代码:

#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring> 
#include <cmath>
#define setbit(x,y) x|=(1<<(y)) //将X的第Y位置1
#define clrbit(x,y) x&=~(1<<(y)) //将X的第Y位清0
#define sf scanf
#define pf printf
#define INF 1 << 29
#define eps 1e-6
const double PI = acos(-1.0);               
#define lint __int64
#define LL long long 
#define MAXN 1e9 + 7
#define maxn 1005
//101^110=011 异或
#define ULLint unsigned long long //2^64-1>1.8*10^19 
#define clr(x) memset(x, 0, sizeof(x))
#define Clr(x) memset(x, -1, sizeof(x))

using namespace std;
int T,S,D;  
int a,b,c;  
int Dist[maxn];  
int map[maxn][maxn];  
int s[maxn],d[maxn];  
int n;  
int vis[maxn];  
int Dijkstra(int v0) {  
	int Min;  
	int k;  
	for(int i = 0; i <= n; i++){  
		vis[i] = false;  
		Dist[i] = map[v0][i];  
	}  
	vis[v0] = 1;  
	Dist[v0] = 0;  
	for(int v = 0; v <= n; v++) {  
		Min = INF;  
		for(int w = 0; w <= n; w++){  
			if(!vis[w] && (Dist[w] < Min)) {  
				Min = Dist[w];  
				k = w;    
			}    
		}  
		if(Min == INF) break;  
		vis[k] = 1;  
		for(int w = 0; w <= n; w++) {  
			if(!vis[w] && (Min + map[k][w] < Dist[w]))  
			{  
				Dist[w] = Min + map[k][w]; 
			}  
		}    
	}  
	int m = INF; 
	for(int i = 0; i < D;i++) {  
		if(m > Dist[d[i]])  {  
			m = Dist[d[i]];  
		}  
	}  
	return m;     
}  
int main() {  
	int min;  
	while(cin>> T >> S >> D) {  
		for(int i = 0; i < maxn;i++) {  
			for(int j = 0; j < maxn; j++) {  
				map[i][j] = INF;  
			}  
		}  
		n = 0;    
		for(int i = 0; i < T; i++) {  
			cin >> a >> b >> c;  
			if(c < map[a][b]){  
				map[a][b] = map[b][a] = c;  
			} 
			n = max(a, n);
			n = max(b, n);
		}  
		for(int i = 0; i < S; i++)  
			cin >> s[i];  
		for(int j = 0; j <D; j++)  
			cin >> d[j];  
		min = INF;  
		for(int i = 0; i < S; i++) {  
			if(Dijkstra(s[i]) < min)  
				min = Dijkstra(s[i]);  
		}  
		cout << min << endl;  
	}  
	return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值