比赛 ctime蒟蒻生日赛 评测结果 AAAAAAAA
题目名称 旅行计划 最终得分 100
用户昵称 玉带林中挂 运行时间 0.005 s
代码语言 C++ 内存使用 1.84 MiB
提交时间 2017-10-17 21:38:27
显示代码纯文本
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct edge{
	int to,next,s,from;
}e[100005];
int head[105],tot;
int n,m,st;
int dis[105],fa[105];
bool inq[105];
queue<int> q;
void add(int u,int v,int s){
	e[++tot].to=v;
	e[tot].next=head[u];
	e[tot].s=s;
	e[tot].from=u;
	head[u]=tot;
}
void SPFA(){
	memset(dis,127,sizeof(dis));
	dis[st]=0;
	q.push(st);
	inq[st]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int v,c=head[u];c;c=e[c].next){
			v=e[c].to;
			if(dis[v]>=dis[u]+e[c].s){
				fa[v]=c;
				dis[v]=dis[u]+e[c].s;
				if(!inq[v]){q.push(v),inq[v]=1;}
			}
		}
		inq[u]=0;
	}
}
int main(){
	freopen("djs.in","r",stdin);
	freopen("djs.out","w",stdout);
	scanf("%d%d%d",&n,&m,&st);
	for(int u,v,s,i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&s);
		add(u,v,s); 
	} 
	SPFA();
	for(int i=0;i<n;i++){
		printf("%d:\n",i);
		if(dis[i]>=1e9+7)printf("no\n");
		else if(i==st)printf("no\n");
		else{
			printf("path:");
			int ans[105],top=0;
			for(int j=fa[i];;j=fa[e[j].from]){
				ans[++top]=e[j].to;
				if(e[j].from==st)break;
			}
			printf("%d",st);
			for(int j=top;j>0;j--){
				printf(" %d",ans[j]);
			}
			printf("\ncost:%d\n",dis[i]);
		}
	}
	fclose(stdin);fclose(stdout);
	return 0;
}