记录编号 212208 评测结果 AAAAAAAA
题目名称 旅行计划 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2015-12-05 18:26:03 内存使用 2.00 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,v;
int prec[101];
int ans[101];
int dis[101][101];
bool visited[101];
void djs(){
	visited[v] = true;
	int min_v;
	int min_dis;
	for(int i = 2;i<=n;++i){
		min_dis = 1<<20;
		min_v = -1;
		for(int j = 0;j<n;++j){
			if(!visited[j]&&ans[j]<min_dis){
				min_v = j;
				min_dis = ans[j];
			}
		}
		if(min_v==-1)break;
		if(ans[min_v]==dis[v][min_v])prec[min_v] = v;
		for(int j = 0;j<n;++j){
			if(ans[j]>ans[min_v]+dis[min_v][j])
				{
					ans[j] = ans[min_v]+dis[min_v][j];
					prec[j] = min_v;
				}
		}
		visited[min_v] = true;
	}
}
void path(int num){
	if(num!=v)path(prec[num]);
	else{
		 printf("%d",v);
		return;
	}
	printf(" %d",num);
}
void output(int num){
	printf("%d:\n",num);
	if(ans[num]==1<<20){
		printf("no\n");
	}else{
		printf("path:");
		path(num);
		printf("\n");
		printf("cost:%d\n",ans[num]);
	}
}
int main(){
	freopen("djs.in","r",stdin);
	freopen("djs.out","w",stdout);
	scanf("%d %d %d",&n,&m,&v);
	int a,b,c;
	for(int i = 0;i<n;++i)ans[i] = 1<<20;
	ans[v] = 0;
	for(int i = 0;i<n;++i){
		for(int j = 0;j<n;++j)dis[i][j] = 1<<20;
		dis[i][i] = 0;
	}
	for(int i = 0;i<m;++i){
		scanf("%d %d %d",&a,&b,&c);
		dis[a][b] = c;
		if(a==v)ans[b] = c;
	}
	djs();
	ans[v] = 1<<20;
	for(int i = 0;i<n;++i){
		output(i);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}