记录编号 337339 评测结果 AAAAAAAA
题目名称 旅行计划 最终得分 100
用户昵称 GravatarHoohan(%Dalao) 是否通过 通过
代码语言 C++ 运行时间 0.013 s
提交时间 2016-11-04 10:49:06 内存使用 0.24 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstdlib>

using namespace std;

const int maxn=110,maxm=10010,maxdist=0x3f3f3f3f;

struct Edge{
	int from,to,dist;
};

struct heapnode{
	int d,u;
	bool operator < (const heapnode & x) const{
		return d > x.d;
	}
};

int n,m,start;
vector <Edge> edges;
vector <int> G[maxn];
bool done[maxn];
int d[maxn];
int p[maxn];

void addedge(int a,int b,int c)//from to dist
{
	edges.push_back( (Edge) {a,b,c} );
	int ls=edges.size();		//ԭΪM 
	G[a].push_back(ls-1);
}

void dij(int s)
{
	priority_queue <heapnode> q;
	for(int i=0;i<n;i++) d[i]=maxdist;
	d[s]=0;
	memset(done,0,sizeof(done));
	q.push((heapnode) {0,s});
	while(!q.empty())
	{
		heapnode x=q.top();q.pop();
		int u=x.u;
		if(done[u]) continue;
		done[u]=true;
		for(int i=0; i < G[u].size() ;i++)
		{
			Edge &e = edges[G[u][i]];
			if(d[e.to] > d[u]+e.dist)
			{
				d[e.to]=d[u]+e.dist;
				p[e.to]=G[u][i];
				q.push((heapnode) {d[e.to],e.to});
			}
		}
	}
}

void print_path(int now)
{
	if(edges[p[now]].from==start) {
		cout<<start<<' ';
		return;
	}
	print_path(edges[p[now]].from);
	cout<<edges[p[now]].from<<' ';
}

int main()
{
	freopen("djs.in","r",stdin);
	freopen("djs.out","w",stdout);
	cin>>n>>m>>start;
	for(int i=0;i<n;i++) G[i].clear();
	edges.clear();
	int a,b,c;
	for(int i=0;i<m;i++)
	{
		cin>>a>>b>>c;
		addedge(a,b,c);
	}
	dij(start);
	
//	for(int i=0;i<n;i++) cout<<d[i]<<' ';
//	cout<<endl;
//	for(int i=0;i<n;i++) cout<<p[i]<<' ';
//	cout<<endl;
	
	for(int i=0;i<n;i++)
	{
		cout<<i<<':'<<endl;
		if(d[i]==maxdist || d[i]==0)
		{
			cout<<"no"<<endl;
		}
		else{
			cout<<"path:";
			print_path(i);
			cout<<i<<endl<<"cost:"<<d[i]<<endl;
		}
	}
	return 0;
}