POJ T3268 Silver Cow Party

版权声明:希望能帮到弱校的ACMer成长,因为自己是弱校菜鸡~~~~ https://blog.csdn.net/Mr__Charles/article/details/82053989

                         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;
} 

猜你喜欢

转载自blog.csdn.net/Mr__Charles/article/details/82053989