hdu1142

/*
分析:
    亢奋死了,1a~
    半个月前看到的题,当时只写了一半,当时的思路最后一步需要堆来
辅助。今儿再看到这个题,忽然发现……不用堆也行,虽然会堆了0.0


    题目不难,看网上牛牛的思路吧,菜鸟就不献丑了0.0


    明儿就期末考试了,菜菜还在这儿敲代码,要挂了T^T~
    不过不是说的,一个教室,就我一人儿、听着音乐、敲着代码,不是
第一次了,始终觉得,这感觉,挺好O(∩_∩)O~
                                                         2012-06-24
*/








#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct A
{
	int dis;
	int flag;
}E[1001];
struct B
{
	int dis;
	int num;
}T[1001];
int map[1001][1001];
int cmp(const struct B *a,const struct B *b)
{
	return b->dis-a->dis;
}
int main()
{
	int n,m;
	int i,l;
	int k;
	int a,b,d;
	int hash[1001];
	int ans[1001];
	while(scanf("%d",&n),n)
	{
		scanf("%d",&m);

		for(i=1;i<=n;i++)
		for(l=1;l<=n;l++)
			map[i][l]=0;
		for(i=0;i<m;i++)
		{
			scanf("%d%d%d",&a,&b,&d);
			map[a][b]=map[b][a]=d;
		}

		for(i=1;i<=n;i++)
		{
			E[i].dis=11111111;
			E[i].flag=1;
		}

		k=2;
		E[k].dis=0;
		while(k)
		{
			E[k].flag=0;
			if(E[k].dis>E[1].dis)	break;
			for(i=1;i<=n;i++)
			{
				if(map[i][k]==0)	continue;
				if(E[k].dis+map[i][k]<E[i].dis)	E[i].dis=E[k].dis+map[i][k];
			}
			k=0;
			for(i=1;i<=n;i++)	if(E[i].flag)	{k=i;break;}
			for(i++;i<=n;i++)	if(E[i].flag&&E[i].dis<E[k].dis)	k=i;
		}


		if(E[1].dis==11111111)	{printf("0\n");continue;}


		memset(hash,0,sizeof(hash));
		T[0].num=1;
		T[0].dis=E[1].dis;
		k=1;
		hash[1]=1;
		for(i=2;i<=n;i++)
		{
			if(E[i].dis>=E[1].dis)	continue;
			T[k].num=i;
			T[k].dis=E[i].dis;
			hash[i]=1;
			k++;
		}
		qsort(T,k,sizeof(T[0]),cmp);

		for(i=1;i<=n;i++)	ans[i]=0;
		ans[1]=1;
		for(i=0;i<k;i++)
		{
			if(ans[T[i].num]==0)continue;
			for(l=1;l<=n;l++)	if(hash[l]==1&&map[T[i].num][l]!=0&&E[l].dis<T[i].dis)	ans[l]+=ans[T[i].num];
		}

		printf("%d\n",ans[2]);
	}
	return 0;
}


你可能感兴趣的:(struct,音乐)