HDU 4725
- 难点是如何将楼层转化到图中,
- 用2个点将一个面(楼层)抽象出来,1个入点,1个出点
- 一个面上的所有点都指向出点,权值为0
- 入点指向该面所有的点(除了出点),权值为0
- 入点指向出点,权值为
0
, - 中间的楼层的出点分别指向上一层的入点和下一层的入点,权值为
c
.将所有楼层都连接起来 - 没有最短路则
dist[n] = MAX
- dij
#include <iostream>
#include <string.h>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 3e5+5;
const int MAX = 0x3f3f3f3f;
vector<pair<int,int> > e[maxn];
int n,m,cost;
int dist[maxn];
int dij() {
priority_queue<pair<int,int> > que;
memset(dist,0x3f,sizeof dist);
que.push( make_pair(0,1) );
dist[1] = 0;
while (!que.empty()) {
int cur = que.top().second; que.pop();
for (int i=0; i<e[cur].size(); i++) {
int to = e[cur][i].first;
int div = e[cur][i].second;
if (dist[to] > dist[cur] + div) {
dist[to] = dist[cur] + div;
que.push( make_pair(-dist[to],to) );
}
}
}
return dist[n];
}
int main() {
int times,k=0;
scanf("%d",×);
while (times--) {
scanf("%d%d%d",&n,&m,&cost);
int temp;
for (int i=1; i<=n; i++) {
scanf("%d",&temp);
e[temp*2+n-1].push_back( make_pair(i,0) );
e[i].push_back( make_pair(temp*2+n,0) );
}
int from,to,div;
for (int i=1; i<=m; i++) {
scanf("%d%d%d",&from,&to,&div);
e[from].push_back( make_pair(to,div) );
e[to].push_back( make_pair(from,div));
}
for (int i=1; i<=n; i++) {
from = 2 * i + n;
if (i > 1) {
to = from - 3;
e[from].push_back( make_pair(to,cost) );
}
if (i < n) {
to = from + 1;
e[from].push_back( make_pair(to,cost) );
}
}
int ans = dij();
if (ans == MAX) printf("Case #%d: -1\n",++k);
else printf("Case #%d: %d\n",++k,ans);
for (int i=1; i<=3 * n; i++) e[i].clear();
}
return 0;
}
- spfa
#include <iostream>
#include <string.h>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
const int maxn = 3e5+5;
const int MAX = 0x3f3f3f3f;
vector<pair<int,int> > e[maxn];
int n,m,cost;
int dist[maxn];
bool vis[maxn];
int spfa() {
queue<int> que;
memset(vis,0,sizeof vis);
memset(dist,0x3f,sizeof dist);
que.push(1);
dist[1] = 0; vis[1] = 1;
while (!que.empty()) {
int cur = que.front(); que.pop();
vis[cur] = 0;
for (int i=0; i<e[cur].size(); i++) {
int to = e[cur][i].first;
int div = e[cur][i].second;
if (dist[to] > dist[cur] + div) {
dist[to] = dist[cur] + div;
if (!vis[to]) {
vis[to] = 1;
que.push(to);
}
}
}
}
return dist[n];
}
int main() {
int times,k=0;
scanf("%d",×);
while (times--) {
scanf("%d%d%d",&n,&m,&cost);
int temp;
for (int i=1; i<=n; i++) {
scanf("%d",&temp);
e[temp*2+n-1].push_back( make_pair(i,0) );
e[i].push_back( make_pair(temp*2+n,0) );
}
int from,to,div;
for (int i=1; i<=m; i++) {
scanf("%d%d%d",&from,&to,&div);
e[from].push_back( make_pair(to,div) );
e[to].push_back( make_pair(from,div));
}
for (int i=1; i<=n; i++) {
from = 2 * i + n;
if (i > 1) {
to = from - 3;
e[from].push_back( make_pair(to,cost) );
}
if (i < n) {
to = from + 1;
e[from].push_back( make_pair(to,cost) );
}
}
int ans = spfa();
if (ans == MAX) printf("Case #%d: -1\n",++k);
else printf("Case #%d: %d\n",++k,ans);
for (int i=1; i<=3 * n; i++) e[i].clear();
}
return 0;
}