比赛 |
测试比赛 |
评测结果 |
|
题目名称 |
加法问题 |
最终得分 |
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;
}