10分:
#include<bits/stdc++.h>
using namespace std;
int ans,ans2,cnt,n,m,s,head[100010],head2[100010],dis[1010],dis2[1010];
bool vis[1010],vis2[1010];
struct edge{
int to,next,dis;
}e[100010],e2[100010];
struct node{
int pos,dis;
bool operator <(const node &x)const{
return x.dis<dis;
}
};
priority_queue<node> q;
void dijkstra(){
dis[s]=0;
q.push((node){s,0});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(vis[x])
continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].dis){
dis[y]=dis[x]+e[i].dis;
if(!vis[y])
q.push((node){y,dis[y]});
}
}
}
}
void dijkstra2(){
dis2[s]=0;
q.push((node){s,0});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(vis2[x])
continue;
vis2[x]=1;
for(int i=head2[x];i;i=e2[i].next){
int y=e2[i].to;
if(dis[y]>dis2[x]+e2[i].dis){
dis2[y]=dis2[x]+e2[i].dis;
if(!vis2[y])
q.push((node){y,dis[y]});
}
}
}
}
void add1(int u,int v,int d){
e[++cnt].dis=d;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void add2(int u,int v,int d){
e2[++cnt].dis=d;
e2[cnt].to=v;
e2[cnt].next=head[u];
head2[u]=cnt;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;i++)
dis[i]=0x7fffff;
for(int u,v,d,i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&d);
add1(u,v,d);
add2(v,u,d);
}
dijkstra();
for(int i=1;i<=n;i++)
ans=max(ans,dis[i]);
dijkstra2();
for(int i=1;i<=n;i++)
ans2=max(ans2,dis2[i]);
printf("%d",ans+ans2);
return 0;
}
0分代码:
#include<bits/stdc++.h>
using namespace std;
int ans,ans2,cnt,cnt2,n,m,s,head[100010],head2[100010],dis[1010],dis2[1010];
bool vis[1010],vis2[1010];
struct edge{
int to,next,dis;
}e[100010],e2[100010];
struct node{
int pos,dis;
bool operator <(const node &x)const{
return x.dis<dis;
}
};
priority_queue<node> q;
void dijkstra(){
dis[s]=0;
q.push((node){s,0});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(vis[x])
continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].dis){
dis[y]=dis[x]+e[i].dis;
if(!vis[y])
q.push((node){y,dis[y]});
}
}
}
}
void dijkstra2(){
dis2[s]=0;
q.push((node){s,0});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(vis2[x])
continue;
vis2[x]=1;
for(int i=head2[x];i;i=e2[i].next){
int y=e2[i].to;
if(dis2[y]>dis2[x]+e2[i].dis){
dis2[y]=dis2[x]+e2[i].dis;
if(!vis2[y])
q.push((node){y,dis2[y]});
}
}
}
}
void add1(int u,int v,int d){
e[++cnt].dis=d;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void add2(int u,int v,int d){
e2[++cnt2].dis=d;
e2[cnt2].to=v;
e2[cnt2].next=head2[u];
head2[u]=cnt2;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n;i++)
dis[i]=0x7fffff;
for(int i=1;i<=n;i++)
dis2[i]=0x7fffff;
for(int u,v,d,i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&d);
add1(u,v,d);
add2(v,u,d);
}
dijkstra();
for(int i=1;i<=n;i++)
ans=max(ans,dis[i]);
dijkstra2();
for(int i=1;i<=n;i++)
ans2=max(ans2,dis2[i]);
printf("%d",ans+ans2);
return 0;
}