记录编号 |
39412 |
评测结果 |
AAAAAAAAAA |
题目名称 |
三元限制最短路 |
最终得分 |
100 |
用户昵称 |
CC |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.425 s |
提交时间 |
2012-07-10 15:19:24 |
内存使用 |
111.01 MiB |
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#define INF 1000000000
struct edge {
int y;
edge *next;
edge (int y,edge *next): y(y),next(next) {};
}*a[20],*no[3001][3001];
struct pp {
int u,v;
};
using namespace std;
int n,m,K,dist,before;
int num,dis[3001][3001],pre[3001][3001],ans[3001];
pp q[1000000];
void spfa() {
int head = 0,tail = 0;
memset(dis,61,sizeof(dis));
q[0].u = 0;
q[0].v = 1;
dis[0][1] = 0;
pre[0][1] = 0;
bool bu;
while (head <= tail) {
int u = q[head].u,v = q[head++].v;
for (edge *p = a[v];p;p = p->next) {
bu = 0;
for (edge *t = no[u][v];t;t = t->next) {
if (p->y == t->y) bu = 1;
}
if (bu) continue;
if (dis[v][p->y] > dis[u][v] + 1) {
dis[v][p->y] = dis[u][v] + 1;
pp e;
e.u = v;e.v = p->y;
pre[v][p->y] = u;
q[++tail] = e;
}
}
}
}
int main() {
freopen("patha.in","r",stdin);
freopen("patha.out","w",stdout);
scanf("%d%d%d", &n, &m, &K);
int p,q,r;
for (int i = 1;i <= m;i++) {
scanf("%d%d", &p, &q);
a[p] = new edge(q,a[p]);
a[q] = new edge(p,a[q]);
}
for (int i = 1;i <= K;i++) {
scanf("%d%d%d", &p, &q, &r);
no[p][q] = new edge(r,no[p][q]);
}
spfa();
dist = INF;
for (int i = 1;i <= n;i++) if (dis[i][n] < dist) {
dist = dis[i][n];
before = i;
}
printf("%d\n", dist);
ans[dist + 1] = n;ans[dist] = before;
num = dist;
for (int i = pre[before][n];i != 0;i = pre[before][i]) {
ans[--dist] = i;
int tmp = before;
before = i;
i = tmp;
}
for (int i = 1;i <= num + 1;i++) printf("%d ", ans[i]);
return 0;
}