哪位大佬能看一下我的代码的问题
查看原帖
哪位大佬能看一下我的代码的问题
755812
royle_9楼主2023/7/29 13:33
#include<bits/stdc++.h>
using namespace std;
int n, m;
struct node{
	int u, d;
	node(int _u, int _d){
		u = _u;
		d = _d;
	}
	bool operator < (const node &x) const{
		return d > x.d;
	}
};
struct edge{
	int v, w;
	edge(int _v, int _w){
		v = _v;
		w = _w;
	}
};
vector<edge> g[2000010];
priority_queue<node> q;
long long dis[2000010];
int vis[2000010];
void dijkstra(){
	for (int i = 0; i < 2000010; i++){
		dis[i] = 1e10;
	}
	dis[0] = 0;
	q.push(node(0, 0));
	while(!q.empty()){
		int u = q.top().u;
		int d = q.top().d;
		q.pop();
		if(vis[u])continue;
		vis[u] = 1;
		for (int i = 0; i < g[u].size(); i++){
			int v = g[u][i].v;
			int w = g[u][i].w;
			if(dis[v] > dis[u] + w){
				dis[v] = dis[u] + w;
				q.push(node(v, dis[v]));
			}
		}
	}
}
int main(){
	int z = 1;
	while(true){
		cin >> n >> m;
		if(n == 0 && m == 0){
			break;
		}
		for (int i = 0; i < n; i++){//横边 
			for (int j = 0; j < m - 1; j++){
				int a;
				cin >> a;
				if (i == 0){
					g[(n - 1) * (m - 1) * 2 + 1].push_back(edge(2 * j + 1, a));
					g[2 * j + 1].push_back(edge((n - 1) * (m - 1) * 2 + 1, a));
				} else {
					if(i == n - 1){
						g[0].push_back(edge(2 * (n - 2) * (m - 1) + 2 * j + 2, a));
						g[2 * (n - 2) * (m - 1) + 2 * j + 2].push_back(edge(0, a));
					} else {
						g[2 * j + 1 + i * (m - 1) * 2].push_back(edge(2 * j + 1 + (i - 1) * (m - 1) * 2 + 1, a));
						g[2 * j + 1 + (i - 1) * (m - 1) * 2 + 1].push_back(edge(2 * j + 1 + i * (m - 1) * 2, a));
					}
				}
			}
		}
		for (int i = 0; i < n - 1; i++){//竖边 
			for (int j = 0; j < m; j++){
				int a;
				cin >> a;
				if(j == 0){
					g[0].push_back(edge(2 + 2 * i * (m - 1), a));
					g[2 + 2 * i * (m - 1)].push_back(edge(0, a));
				} else {
					if(j == m - 1){
						g[(n - 1) * (m - 1) * 2 + 1].push_back(edge(2 * j - 1 + 2 * i * (m - 1), a));
						g[2 * j - 1 + 2 * i * (m - 1)].push_back(edge((n - 1) * (m - 1) * 2 + 1, a));
					} else {
						g[2 * j - 1 + i * (m - 1) * 2].push_back(edge(2 * j + 2 + i * (m - 1) * 2, a));
						g[2 * j + 2 + i * (m - 1) * 2].push_back(edge(2 * j - 1 + i * (m - 1) * 2, a));
					}
				}
			}
		}
		for (int i = 0; i < n - 1; i++){//斜边 
			for (int j = 0; j < m - 1; j++){
				int a;
				cin >> a;
				g[2 * j + 2 + i * (m - 1) * 2].push_back(edge(2 * j + 1 + i * (m - 1) * 2, a));
				g[2 * j + 1 + i * (m - 1) * 2].push_back(edge(2 * j + 2 + i * (m - 1) * 2, a));
			}
		}
		dijkstra();
		cout << "Case "<< z << ": Minimum = " << dis[(n - 1) * (m - 1) * 2 + 1] << endl;
		z++;
	}
	return 0;
}
2023/7/29 13:33
加载中...