记录编号 149462 评测结果 AAAAAAAA
题目名称 旅行计划 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.009 s
提交时间 2015-02-24 15:47:36 内存使用 3.16 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<ext/pb_ds/priority_queue.hpp>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long LL;
const LL INF=1e18;
const int SIZEN=110;
typedef __gnu_pbds::priority_queue<pair<LL,int>,greater<pair<LL,int> >,pairing_heap_tag> Heap;
typedef Heap::point_iterator Hit;
vector<pair<int,LL> > c[SIZEN];
int N,M,S;
bool used[SIZEN]={0};
LL f[SIZEN];
int fa[SIZEN];
Heap Q;
Hit iter[SIZEN];
const Hit null;
void Dijkstra(int N,int S){
	for(int i=0;i<=N;i++){
		f[i]=INF;
		iter[i]=null;
	}
	memset(used,0,sizeof(used));
	f[S]=0;iter[S]=Q.push(make_pair(f[S],S));
	while(!Q.empty()){
		int x=Q.top().second;Q.pop();
		if(!used[x]){
			used[x]=true;
			for(int i=0;i<c[x].size();i++){
				int u=c[x][i].first;
				LL w=c[x][i].second;
				if(f[x]+w<f[u]){
					f[u]=f[x]+w;
					fa[u]=x;
					if(iter[u]!=null)
						Q.modify(iter[u],make_pair(f[u],u));
					else
						iter[u]=Q.push(make_pair(f[u],u));
				}
			}
		}
	}
}
void print_path(int x){
	vector<int> ans;
	ans.push_back(x);
	while(x!=S){
		x=fa[x];
		ans.push_back(x);
	}
	printf("path:");
	for(int i=ans.size()-1;i>=0;i--) printf("%d ",ans[i]);
	printf("\n");
}
void answer(void){
	for(int i=0;i<N;i++){
		printf("%d:\n",i);
		if(f[i]==INF||i==S) printf("no\n");
		else{
			print_path(i);
			printf("cost:%lld\n",f[i]);
		}
	}
}
void read(void){
	scanf("%d%d%d",&N,&M,&S);
	for(int i=1;i<=M;i++){
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		c[a].push_back(make_pair(b,w));
	}
}
int main(){
	freopen("djs.in","r",stdin);
	freopen("djs.out","w",stdout);
	read();
	Dijkstra(N,S);
	answer();
	return 0;
}