记录编号 |
149462 |
评测结果 |
AAAAAAAA |
题目名称 |
旅行计划 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}