您的位置:首页 > 其它

poj 2394 Checking an Alibi

2011-09-08 20:27 1056 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: