hdu1224

/*
分析:
    没用DP,也没用DFS,咱用的最短路~,只是把Dij稍稍改了下下。
思路:Dij每次抽取所有已被发现的点的中路径值最短并且没有作
为过中心的点作为下一个中心。而这里是:每次抽取所有已被发现的点
中,没有作为过中心,并且编号最靠前的点作为下次中心。


    至于这个思路的正确性,在这里就不证明了~,和Dij是相似的~


                                                    2012-06-07
*/










#include"stdio.h"
#include"string.h"
struct A
{
	int ans;
	int flag;
	int pre;
}E[102];
int main()
{
	int T,Case;
	int n,m;
	int k,i;
	int map[102][102];
	int point[102];
	int a,b;
	int temp;
	int temp1,temp2;
	int max;
	int ans[10011];
	scanf("%d",&T);
	for(Case=1;Case<=T;Case++)
	{
		scanf("%d",&n);
		temp=n+1;
		max=0;
		for(i=1;i<=n;i++)	{scanf("%d",&point[i]);max=max>point[i]?max:point[i];}
		point[n+1]=max+1;


		memset(map,0,sizeof(map));
		scanf("%d",&m);
		while(m--)
		{
			scanf("%d%d",&a,&b);
			temp1=a>b?b:a;
			temp2=a>b?a:b;
			map[temp1][temp2]=point[temp2];
		}


		for(i=1;i<=temp;i++)
		{
			E[i].ans=0;
			E[i].flag=1;
			E[i].pre=i;
		}


		k=1;
		while(k)
		{
			E[k].flag=0;
			for(i=k+1;i<=temp;i++)
			{
				if(map[k][i]==0)	continue;
				if(E[k].ans+map[k][i]>E[i].ans)
				{
					E[i].ans=E[k].ans+map[k][i];
					E[i].pre=k;
				}
			}


			k=0;
			for(i=1;i<=n;i++)	if(E[i].flag&&E[i].ans)	{k=i;break;}
		}


		printf("CASE %d#\n",Case);
		printf("points : %d\n",E[n+1].ans-max-1);
		printf("circuit : ");


		k=E[n+1].pre;
		i=0;
		ans[i]=k;
		while(k!=1)
		{
			k=E[k].pre;
			ans[++i]=k;
		}
		for(;i>=0;i--)	printf("%d->",ans[i]);
		printf("1\n");


		if(Case<T)	printf("\n");
	}
	return 0;
}


你可能感兴趣的:(hdu1224)