现在的位置: 首页 > 综合 > 正文

hdu 2145 zz’s Mysterious Present

2018年12月31日 ⁄ 综合 ⁄ 共 1140字 ⁄ 字号 评论关闭

最短路SPFA(),排序

 

 

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
#define inf 0x3fffffff
int map[310][310],n,m,k,ren[310],v[310],st,flag[310],d[310];
struct op
{
	int dis,id;
	double t;
}p[310];
int cmp(const void *a,const void *b)
{
	struct op *c,*d;
	c=(struct op *)a;
	d=(struct op *)b;
	if(c->t>d->t)
		return 1;
	else if(c->t<d->t)
		return -1;
	else if(c->dis!=d->dis)
		return d->dis-c->dis;
	else return d->id-c->id;
}
void SPFA()
{
	queue<int >Q;
   int i,x;
   memset(flag,0,sizeof(flag));
   for(i=1;i<=n;i++)
       d[i]=inf;
   d[st]=0;
   Q.push(st);
   flag[st]=1;
   while(!Q.empty())
   {
       x=Q.front();
	   Q.pop();
       flag[x]=0;
       for(i=1;i<=n;i++)
       {
           if(d[i]>d[x]+map[x][i])
           {
               d[i]=d[x]+map[x][i];
               if(!flag[i])
               {
                   Q.push(i);
                   flag[i]=1;
               }
           }
       }
   }
}
int main()
{
	int i,j,x,y,c;
	while(scanf("%d%d%d",&n,&m,&k)!=-1)
	{
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				map[i][j]=inf;
			for(i=1;i<=k;i++)
			{
				scanf("%d%d%d",&x,&y,&c);
				if(map[y][x]>c)
				    map[y][x]=c;//建反图,有向图,刚开始以为无向图W了7次
			}
			scanf("%d",&st);
			SPFA();
			for(i=1;i<=m;i++)
				scanf("%d",&ren[i]);
			for(i=1;i<=m;i++)
				scanf("%d",&v[i]);
			for(i=1;i<=m;i++)
			{
				p[i-1].id=i;
				p[i-1].dis=d[ren[i]];				
				p[i-1].t=p[i-1].dis*1.0/v[i];
			}
			qsort(p,m,sizeof(p[0]),cmp);
			if(p[0].dis==inf)puts("No one");
			else 
			printf("%d\n",p[0].id);
	}
	return 0;
}

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.