题目连接:http://poj.org/problem?id=3268
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int M=1e6+100;
const int N=1e3+100;
const int INF=0x3f3f3f3f;
typedef long long ll;
int n,m;
int map1[N][N];
int map2[N][N];
int dis1[N];
int dis2[N];
//dis数组记录节点x到其他点的最短路长度
void dijkstra(int ma[][N],int dis[],int x){
int u;
int vis[N]={0};//记录某点是否被处理过
fill(dis,dis+N,INF);
dis[x]=0;
for(int i=1;i<=n;i++){
int mi=INF;
for(int j=1;j<=n;j++){
if(!vis[j]&&mi>dis[j]){
mi=dis[j];
u=j;
}
}
vis[u]=1;
for(int j=1;j<=n;j++){
if(!vis[j]&&dis[j]>dis[u]+ma[u][j])
dis[j]=dis[u]+ma[u][j];
}
}
}
int main(){
int a,b,t,x;
int ans=0;
cin>>n>>m>>x;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map1[i][j]=INF;
map2[i][j]=INF;
}
}
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&t);
map1[a][b]=t;
map2[b][a]=t;
}
dijkstra(map1,dis1,x);
dijkstra(map2,dis2,x);
for(int i=1;i<=n;i++){
if(ans<dis1[i]+dis2[i])
ans=dis1[i]+dis2[i];
}
printf("%d\n",ans);
return 0;
}
注:参考别人代码