|  | 
				
					
	
		
		
		思路: 就是一个最短路径的问题。但是题目数据规模跟描述不符合。 数组要开大一些才能过。官方数据是描述是符合的,可能是管理员加了一些进去。
  #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; 
  }   |