UVA - 10986 Sending email(Dijkstra 인접 테이블 + 우선 순위 대기열 최적화)
s점에서 t점까지의 최소 거리를 구하는 그림을 주세요.
확인:
적나라한 최단길이지만 n이 너무 크면 인접 행렬을 사용할 수 없기 때문에 Dijkstra에 대한 인접표 + 우선 대기열 최적화가 필요합니다.
여기에서 나는 Dijkstra의 인접표 + 우선 대기열 방법을 하나의 종류로 봉인했는데 매우 유용한 것 같다.
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 20005;
struct Edge {
int from, to, dist;
Edge(int u,int v,int d) {
from = u;
to = v;
dist = d;
}
};
struct HeapNode {
int d, u;
HeapNode(int _d,int _u) {
d = _d;
u = _u;
}
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
};
struct Dijkstra {
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn]; //
int d[maxn]; //s
int p[maxn]; //
void init(int n) {
this->n = n;
for(int i = 0; i < n; i++) {
G[i].clear();
}
edges.clear();
}
void AddEdge(int from,int to,int dist) {
edges.push_back(Edge(from,to,dist));
m = edges.size();
G[from].push_back(m-1);
}
void dijkstra(int s) {
priority_queue<HeapNode> Q;
for(int i = 0; i < n; i++) {
d[i] = INF;
}
d[s] = 0;
memset(done,0,sizeof(done));
Q.push(HeapNode(0,s));
while(!Q.empty()) {
HeapNode x = Q.top();
Q.pop();
int u = x.u;
if(done[u]) {
continue;
}
done[u] = true;
for(int i = 0; i < G[u].size(); i++) {
Edge& e = edges[G[u][i]];
if(d[e.to] > d[u] + e.dist) {
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push(HeapNode(d[e.to], e.to));
}
}
}
}
};
int main() {
Dijkstra dij;
int t,cas = 1;
int n,m;
int u,v,dist;
int s,e;
scanf("%d",&t);
while(t--) {
scanf("%d%d%d%d",&n,&m,&s,&e);
dij.init(n);
for(int i = 0; i < m; i++) {
scanf("%d%d%d",&u,&v,&dist);
dij.AddEdge(u,v,dist);
dij.AddEdge(v,u,dist);
}
dij.dijkstra(s);
printf("Case #%d: ",cas++);
if(dij.d[e] == INF) {
printf("unreachable
");
}else {
printf("%d
",dij.d[e]);
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
kintone에서 사용하는 메일 서비스 요약kintone에는 이른바 메일 서버 기능이 없기 때문에, 예를 들면 「고객 마스터에 등록된 메일 주소로 메일을 송신한다」라고 하는 경우는 외부의 메일 서비스를 이용하게 됩니다. kintone 개발시 자주 사용하는 메...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.