poj 2394 Checking an Alibi

来源:互联网 发布:migration数据库 编辑:程序博客网 时间:2024/06/10 05:09

dijkstra~最近一直做类似的题目,有点感觉了~虽然都是水题,不过也蛮高兴的,毕竟目前只是粗粗的预习了下数据结构!

这个学期开始教数据结构,要加油了!


#include<stdio.h>
#include<string.h>
#define MAX 501
#define INF_MAX 100000001
int map[MAX][MAX];
int dis[MAX];
int used[MAX];
int ans[MAX];


void Dijstala(int m)
{
int i,j,min,v;
for(i=1;i<=m;i++)
{
used[i]=0;
dis[i]=map[1][i];
}
dis[1]=0;//谷仓离自己的距离为0
used[1]=1;
while(1)
{
min=INF_MAX;
v=0;
for(i=1;i<=m;i++)
if(!used[i]&&dis[i]<min)
{
min=dis[i];
v=i;
}
if(v==0)
break;
used[v]=1;
for(j=1;j<=m;j++)
if(!used[j]&&map[v][j]+dis[v]<dis[j])
dis[j]=map[v][j]+dis[v];
}
}




int main()
{
int n,t,i,a,b,c,j,r,m,q,x;
r=0;
scanf("%d%d%d%d",&n,&t,&q,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=INF_MAX;
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)//去重边
{
   map[a][b]=c;
map[b][a]=c;
}
}
Dijstala(n);
for(i=1;i<=q;i++)
{
scanf("%d",&x);
if(dis[x]<=m)//小于m的牛可以偷吃到
ans[r++]=i;
}
printf("%d\n",r);
for(i=0;i<r;i++)
printf("%d\n",ans[i]);
return 0;
}
原创粉丝点击