pku 2394

pku 2394

 2009年7月25日

题目链接:PKU 2394 Checking an Alibi 
 
 分类:最短路

题目分析与算法原型
         其他没什么,就是需要注意重边的处理,Dijkastra就行了

Code:

 1
#include < stdio.h >
 2 #include < string .h >
 3 #define  len 505
 4 #define  max 0x7fffffff
 5
 6 int  f,p,c,m,i,j,map[len][len],dis[len],flag[len],cow[len],u,res[len],pos;
 7
 8 void  init()
 9 {
10    for(i=1;i<=f;i++)
11        for(j=1;j<=f;j++)
12        {
13            if(i==j)map[i][j]=0;
14            else map[i][j]=max;
15        }

16}

17
18 void  dij( int  v0)
19 {
20    for(i=1;i<=f;i++)dis[i]=map[v0][i];
21    flag[v0]=1;
22    for(i=1;i<f;i++)
23    {
24        int min=max;
25        for(j=1;j<=f;j++)
26            if(flag[j]==0&&dis[j]<min)
27            {
28                u=j;
29                min=dis[j];
30            }

31        if(min==max)return ;
32        flag[u]=1;
33        for(j=1;j<=f;j++)
34            if(flag[j]==0&&map[u][j]<max&&dis[u]+map[u][j]<dis[j])
35                dis[j]=dis[u]+map[u][j];
36    }

37}

38
39 int  main()
40 {
41    while(scanf("%d%d%d%d",&f,&p,&c,&m)!=EOF)
42    {
43        init();
44        memset(flag,0,sizeof(flag));
45        int a,b,cost;
46        for(i=1;i<=p;i++)
47        {
48            scanf("%d%d%d",&a,&b,&cost);
49            if(cost<map[a][b])
50            {
51                map[a][b]=cost;
52                map[b][a]=cost;
53            }

54        }

55        for(i=1;i<=c;i++)
56        {
57            int num;
58            scanf("%d",&num);
59            cow[i]=num;
60        }

61        dij(1);
62        pos=0;
63        for(i=1;i<=c;i++)
64            if(dis[cow[i]]<=m)res[pos++]=i;
65
66        printf("%d\n",pos);
67        for(i=0;i<pos;i++)printf("%d\n",res[i]);
68    }

69    return 0;
70}

71

你可能感兴趣的:(pku 2394)