单元最短路径-Dijkstra算法

普通方法

const int INF = 10000;
const int MAX_V = 100;
int cost[MAX_V][MAX_V]; // 花费
int d[MAX_V]; // 起始顶点到所有顶点最短距离
bool S[MAX_V]; // 是否在集合中
int V = 7; // 顶点数
// 传入的是起始顶点
void dijkstra(int s){
	fill(d, d + V, INF);
	fill(S, S + V, false);
	d[s] = 0;

	while(true){
		int v = -1;
		for(int u = 0; u < V; u++){
			if(!S[u] && (v == -1 || d[u] < d[v])){
				v = u;
			}
		}
		if(v == -1)
			break;
		S[v] = true;
		for(int u = 0; u < V; u++){
			d[u] = min(d[u], d[v] + cost[v][u]);
		}
	}
}

复杂度低

typedef pair<int, int> pii;

int n, m; // 顶点数和边数
int first[100];
int u[100], v[100], w[100], _next[100];
int d[100];
int fa[100];

void read(){
	cin >> n >> m;
	for(int i = 0; i < n; i++)
		first[i] = -1;
	for(int e = 0; e < m; e++){
		cin >> u[e] >> v[e] >> w[e];
		_next[e] = first[u[e]];
		first[u[e]] = e;
	}
}

void dijkstra(){
	for(int i = 0; i < n; i++){
		d[i] = INF;
	}
	d[0] = 0; // 0为起点
	priority_queue<pii, vector<pii>, greater<pii> > pq;
	pq.push(make_pair(0, 0));
	while(!pq.empty()){
		pii pr = pq.top();
		pq.pop();
		int min_idx = pr.second;
		if(pr.first != d[min_idx])
			continue;
		for(int e = first[min_idx]; e != -1; e = _next[e]){
			if(d[u[e]] + w[e] < d[v[e]]){
				d[v[e]] = d[u[e]] + w[e];
				fa[v[e]] = u[e];
				pq.push(make_pair(d[v[e]], v[e]));
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值