|
思路: 就是一个最短路径的问题。但是题目数据规模跟描述不符合。 数组要开大一些才能过。官方数据是描述是符合的,可能是管理员加了一些进去。
#include <stdio.h> #include <string.h> #include <stdlib.h>
#define MAX_E 4096 #define MAX_V 2048 #define MAX_COST (1 << 30)
struct edge_node { int idx, cost; struct edge_node *next; };
struct graph_node { struct edge_node edges[MAX_E], *map[MAX_V]; int edges_cnt, vertexs_cnt; int min_dis[MAX_V]; };
inline int min(int a, int b) { return a < b ? a : b; }
inline void graph_init(struct graph_node *g, int vertexs_cnt) { g->vertexs_cnt = vertexs_cnt; g->edges_cnt = 0; memset(g->map, 0, vertexs_cnt * sizeof(g->map[0])); }
inline void graph_addedge(struct graph_node *g, int from, int to, int cost ) { struct edge_node *e;
e = &g->edges[g->edges_cnt++]; e->idx = to; e->cost = cost; e->next = g->map[from]; g->map[from] = e; }
inline void graph_spfa(struct graph_node *g, int idx) { static int queue[MAX_V], vis[MAX_V], tm, head, tail; int i, val; struct edge_node *e;
for (i = 0; i < g->vertexs_cnt; i++) g->min_dis[i] = MAX_COST; g->min_dis[idx] = 0; head = tail = 0; tm++; queue[tail++] = idx;
while (head != tail) { idx = queue[head++]; vis[idx] = 0; for (e = g->map[idx]; e; e = e->next) { val = g->min_dis[idx] + e->cost; if (val >= g->min_dis[e->idx]) continue; g->min_dis[e->idx] = val; if (vis[e->idx] == tm) continue; queue[tail++] = e->idx; vis[e->idx] = tm; } } }
int main() { static int loc[MAX_V], i, F, C, P, M, from, to, cost, cnt; static struct graph_node g;
freopen("e:\\test\\in.txt", "r", stdin);
scanf("%d%d%d%d", &F, &P, &C, &M); graph_init(&g, F + 1); while (P--) { scanf("%d%d%d", &from, &to, &cost); graph_addedge(&g, from, to, cost); graph_addedge(&g, to, from, cost); } for (i = 0; i < C; i++) scanf("%d", &loc[i]);
graph_spfa(&g, 1); cnt = 0; for (i = 0; i < C; i++) cnt += (g.min_dis[loc[i]] <= M); printf("%d\n", cnt); for (i = 0; i < C; i++) if (g.min_dis[loc[i]] <= M) printf("%d\n", i + 1);
return 0; }
|