POJ T3268 Silver Cow Party
题目思路:
题意很好理解,重点是这图是有向图,你出发到达目的地的路径在返回时不一定能原路返回。所以,要将其他点到X和X到其他点的最短路径都求出来,然后比较他们加和的最大值。(题目给的是边,所以还是不犹豫的用了Spfa)
Spfa写法
#include<cstdio>
#include<algorithm>
#include<queue>
#define maxn 1005
#define INF 0x3f3f3f3f
using namespace std;
bool vis[maxn];
int dis[maxn],head[maxn];
int cnt,n,m,x,ans[maxn];
struct Edge{
int to,time,next;
}edge[maxn*100];
void add(int from,int to,int time){
edge[cnt].to = to;
edge[cnt].time = time;
edge[cnt].next = head[from];
head[from] = cnt++;
}
void Init(){
cnt = 0;
for(int i = 1; i <= n;i++)
head[i] = -1;
}
void Spfa(int s){
int u;
for(int i = 1; i <= n;i++){
vis[i] = false;
dis[i] = INF;
}
queue<int> Q;
dis[s] = 0;
Q.push(s);
vis[s] = true;
while(!Q.empty()){
u = Q.front();
Q.pop();
vis[u] = false;
for(int i = head[u]; i != -1; i = edge[i].next){
int v = edge[i].to;
int w = edge[i].time;
if(dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
if(!vis[v]){
Q.push(v);
vis[v] = true;
}
}
}
}
}
int main(){
int u,v,w;
while(~scanf("%d%d%d",&n,&m,&x)){
Init();
for(int i = 1; i <= m; i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
Spfa(x); //这里先求X到其他点的最短路径
for(int i = 1; i <= n;i++)
ans[i] = dis[i]; //将X到其他点的最短路径进行保存
int max = -1;
for(int i = 1; i <= n;i++){
if(i != x){
Spfa(i); //这里遍历所有其他点到X的最短路径
if(max < dis[x] + ans[i])
max = dis[x] + ans[i]; //求来回的最大值
}
}
printf("%d\n",max);
}
return 0;
}