记录编号 |
147648 |
评测结果 |
AAAAAAAA |
题目名称 |
旅行计划 |
最终得分 |
100 |
用户昵称 |
zccz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.012 s |
提交时间 |
2015-02-02 19:59:09 |
内存使用 |
0.44 MiB |
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
using namespace std;
const int MAXN=100+5;
const int MAXW=10000000;
int G[MAXN][MAXN];
int P[MAXN][MAXN];
int N[MAXN][MAXN];
void walk(int s,int e)
{
if(s==e) return;
cout<<s<<" ";
if(G[s][N[s][e]]==MAXW)
walk(N[s][N[s][e]],N[s][e]);
walk(N[s][e],e);
}
int main()
{
freopen("djs.in","r",stdin);
freopen("djs.out","w",stdout);
int n,m,v,x,y;
cin>>n>>m>>v;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
G[i][j]=MAXW;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
N[i][j]=j;
for(int i=0;i<m;i++)
{
cin>>x>>y;
cin>>G[x][y];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
P[i][j]=G[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
if(P[i][k]+P[k][j]<P[i][j])
{
P[i][j]=P[i][k]+P[k][j];
N[i][j]=k;
}
for(int i=0;i<n;i++)
{
cout<<i<<":"<<endl;
if(P[v][i]==MAXW||i==v) cout<<"no"<<endl;
else
{
cout<<"path:";
walk(v,i);
cout<<i<<endl<<"cost:"<<P[v][i]<<endl;
}
}
return 0;
}