标签:fill out 北京大学 i++ namespace 优化问题 北京 迪杰斯特拉 mes
基本思想:
解法1:
抓住一个关键点:只可以从阵营1到阵营2;
如果是1阵营,则可以到达1或者2阵营;
如果是2阵营,则只可以到达2阵营;
所以在此基础上,进行迪杰斯特拉的优化问题;
解法2:
看一位大佬所给出思想,之前自己想删边,结果失败了。
由于只能从1阵营到2阵营,所以只需要删除从2阵营到1阵营的边即可,这样只需要一次最短路径遍历;
关键点:
无;
#include<iostream> #include<stdlib.h> #include<vector> #include<string> using namespace std; const int maxn = 700; const int INF = 1000000; int n; int m; int ma[maxn][maxn]; bool vis[maxn]; int camp[maxn]; int dis[maxn]; void init() { fill(vis, vis + maxn, false); fill(camp, camp + maxn, 0); fill(dis, dis+maxn, INF); fill(ma[0], ma[0] + maxn * maxn, INF); } void dij(int st) { dis[st] = 0; for (int u = 0; u < n; u++) { int index = -1; int Min = INF; for (int i = 1; i <= n; i++) { if (!vis[i] && dis[i] < Min) { index = i; Min = dis[i]; } } if (index == -1) return; vis[index] = true; for (int i = 1; i <= n; i++) { if (camp[index] == 1) { if (!vis[i] && ma[index][i] != INF && dis[i] > ma[index][i] + dis[index]) { dis[i] = ma[index][i] + dis[index]; } } else { if (!vis[i] && ma[index][i] != INF && dis[i] > ma[index][i] + dis[index]&&camp[i]==2) { dis[i] = ma[index][i] + dis[index]; } } } } } int main() { while (cin >> n) { if (n == 0) break; init(); int a, b, d; cin >> m; for (int i = 0; i < m; i++) { cin >> a >> b >> d; if(d<ma[a][b]) ma[a][b] = ma[b][a] = d; } for (int i = 1; i <= n; i++) { cin >> camp[i]; } dij(1); if (dis[2] != INF) cout << dis[2] << endl; else cout << -1 << endl; } }
北京大学机试 I Wanna Go Home 需要二刷 *最短路径衍生问题
标签:fill out 北京大学 i++ namespace 优化问题 北京 迪杰斯特拉 mes
原文地址:https://www.cnblogs.com/songlinxuan/p/12598358.html