比赛 测试比赛 评测结果
题目名称 加法问题 最终得分 0
用户昵称 雾茗 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2018-11-10 20:30:12
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
long long dis1[109000],dis2[109000];
struct node{
	int a,b,t;
}a[109000];
struct edge1{
	int to,next,w;
}e1[109000];
struct edge2{
	int to,next,w;
}e2[109000];
int head1[109000];
int head2[109000];
int cnt1=0;
int cnt2=0;
struct node{
	int dis;
	int pos;
};
void add1(int u,int v,int val){
	e1[++cnt1].next=head1[u];
	e1[cnt1].to=v;
	e1[cnt1].w=val;
	head1[u]=cnt1;
}
void add2(int v,int u,int val){
	e2[++cnt2].next=head2[u];
	e2[cnt2].to=v;
	e2[cnt2].w=val;
	head2[u]=cnt2;
}
void stra1(int x1){
	priority_queue<node> q;
	q.push( (node){0,x1} );
	memset(dis1,0x7f,sizeof(dis1));
	bool vis[1009]={0};
	while( !q.empty() ){
		node tem;
		tem=q.top();
		q.pop();
		int u=tem.pos;
		int ww=tem.dis;
		vis[u]=1;
		for(int i=head1[u];i;i=e1[i].next){
			int v=e1[i].to;
			if(dis[v]>dis[u]+tem.dis){
				dis1[v]=dis1[u]+tem.dis;
				if(vis[v]!=0){
					q.push( (node){dis1[v],,v} );
				}
			}
		}
	}
}
void stra2(int x2){
	queue<int> q;
	int vis[1009]={0};
	q.push(x2);
	vis[x2]=1;
	memset(dis2,0x7f,sizeof(dis2));
	dis2[x2]=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head2[u];i;i=e2[i].next){
			int v=e2[i].to;
			int ww=e2[i].w;
			if(dis2[v]>dis2[u]+ww){
				dis2[v]=dis2[u]+ww;
				if(vis[v]==0){
				q.push(v);
				vis[v]=1;
				}
			}
			
		}
	}
}
int main(){ 
	freopen("sparty.in","r",stdin);
	freopen("sparty.out","w",stdout);
	int n,m,x;
	cin>>n>>m>>x;
	for(int i=1;i<=m;++i){
		cin>>a[i].a>>a[i].b>>a[i].t;
	}
	for(int i=1;i<=m;++i){
		add1(a[i].a,a[i].b,a[i].t);
	}
	stra1(x);
	for(int i=1;i<=m;++i){
		add2(a[i].a,a[i].b,a[i].t);
	}
	stra2(x);
	long long ans=0;
	for(int i=1;i<=n;++i){
		ans=max(dis1[i]+dis2[i],ans);
	}
	cout<<ans;
	return 0;
}