记录编号 204090 评测结果 AAAAAAAA
题目名称 旅行计划 最终得分 100
用户昵称 GravatarGod-Nan 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2015-11-03 21:27:57 内存使用 0.44 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
void clear(int x);
void addpoint(int f,int t,int p);
void cool(int u);
int father[110],head[110],next[11000],to[11000],power[11000];
int dis[110],start;
bool flag[110];
struct dota
{
	int from,to,power;
	bool operator <(const dota&a)const
	{
		if(power!=a.power)
	  return power>a.power;
	  else
	   return to>a.to;
    }
};
int main()
{
	freopen("djs.in","r",stdin);
	freopen("djs.out","w",stdout);
	int n,m,s,i,p,k,f,t;
	scanf("%d%d%d",&n,&m,&s);
	
	for(i=0;i<=109;i++)
	{
		dis[i]=999999999;
		head[i]=-1;
		father[i]=i;
	}
	
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&f,&t,&p);
		addpoint(f,t,p);
	}
	cool(s);
	for(i=0;i<=n-1;i++)
	{
	  printf("%d:\n",i);
	  if(dis[i]==0||dis[i]==999999999)
	  {printf("no\n");continue;}
	  else
	  {
	  	printf("path:");
	  	 clear(i);
	  	printf("%d\n",i);
	  	printf("cost:%d\n",dis[i]);
	  }
	}
	return 0;
}
void addpoint(int f,int t,int p)
{
	next[++start]=head[f];
	to[start]=t;
	head[f]=start;
	power[start]=p;
	return ;
}
void cool(int u)
{
     	priority_queue<dota> dui;
     	dui.push((dota){0,u,0});
     	dis[u]=0;
     	while(!dui.empty())
     	{
     		dota we=dui.top();dui.pop();
     		if(flag[we.to])
     		continue;
     		else
     		 flag[we.to]=1;
     		
     		int point=head[we.to];
     		while(point!=-1)
     		{
     		    if(dis[to[point]]>dis[we.to]+power[point])
     		    {
     		      dis[to[point]]=dis[we.to]+power[point];
				  dui.push((dota){we.to,to[point],dis[to[point]]});
				  father[to[point]]=we.to;
     		    }
     		    point=next[point];
     		}
     	}
}
void clear(int x)
{
	if(x==father[x])
	return ;
	else
	 clear(father[x]);
	 
	 printf("%d ",father[x]);
	 return ;
}