POJ 2394 Checking an Alibi (dijkstra)
呃。。。帮别人改的代码。。。顺便就过了。。
风格不是我的。。
#include <stdio.h>
#include <string.h>
#define MAX 1000000000
#define MAXN 1010
int f,p,c,m,toil=1;
int pnt[MAXN*MAXN],next[MAXN*MAXN],head[MAXN*MAXN],len[MAXN*MAXN];
int cow[MAXN],dist[MAXN],used[MAXN];
int count,min,minp;
void addedge(int u,int v,int w)
{
	pnt[toil]=v;
	len[toil]=w;
	next[toil]=head[u];
	head[u]=toil++;
}

void dijstra(int s)
{
	int i,j;
	memset(used,0,sizeof(used));
	for(i=1;i<=f;i++)
	{
		dist[i]=MAX;
	}
	dist[s]=0;
	for(i=1;i<=f;i++)
	{
		min=MAX;minp=-1;
		for(j=1;j<=f;j++)
		{
			if(!used[j]&&min>dist[j])
			{
				min=dist[j];
				minp=j;
			}
		}
		used[minp]=1;
	
		if(minp==-1) break;
	
		int idx=head[minp];

		while(idx!=-1)
		{
			if(!used[pnt[idx]] && dist[minp]+len[idx]<dist[pnt[idx]])
				dist[pnt[idx]]=dist[minp]+len[idx];
			idx=next[idx];
		}
	}
}
int main()
{   
	int i,u,v,w;
	count=0;
	memset(next,-1,sizeof(next));
	memset(head,-1,sizeof(head));
	scanf("%d%d%d%d",&f,&p,&c,&m);
	for(i=1;i<=p;i++)
	{   
		scanf("%d%d%d",&u,&v,&w);
		addedge(u,v,w);
		addedge(v,u,w);
	}
	for(i=1;i<=c;i++)
		scanf("%d",&cow[i]);
	dijstra(1);
	for(i=1;i<=c;i++)
	{
		if(dist[cow[i]]<=m)
			count++;
	}
	printf("%d\n",count);
	for(i=1;i<=c;i++)
	{
		if(dist[cow[i]]<=m)
			printf("%d\n",i); 
	}

	return 0;
}

  

posted on 2011-07-21 22:29  Eucalyptus  阅读(228)  评论(0编辑  收藏  举报