记录编号 39412 评测结果 AAAAAAAAAA
题目名称 三元限制最短路 最终得分 100
用户昵称 GravatarCC 是否通过 通过
代码语言 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; 
}