ZOJ 2504 Help John!

15 篇文章 0 订阅

用 r来保存John他妈妈告诉他的路线,首先要保证这条路必须通,然后再从r[2](第二个点)求到n的最短路,

最后输出结果就是了.

#include <iostream>
#include <queue>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxen = 30010;
const int maxn = 1010;

struct node{
	int i, v;
	node(int ii = 0, int vv = 0):i(ii), v(vv){}
	bool operator<(const node &rhs)const{
		return v > rhs.v;
	}
};
int dis[maxn],g[maxn][maxn], r[maxn], n, m, k;
bool vis[maxn];
int dijkstra(int s, int e){
	memset(vis, 0, sizeof(vis));
	memset(dis, 0X20, sizeof(dis));
	priority_queue<node> q;
	q.push(node(s, 0));
	dis[s] = g[1][s];
	vis[1] = 1;
	while(q.size()){
		node t = q.top();
		q.pop();
		if(vis[t.i])continue;
		if(t.i == e)break;
		vis[t.i] = 1;
		for(int i = 1; i <= n; ++i){
			if(g[t.i][i] && dis[i] > dis[t.i] + g[t.i][i] && !vis[i]){
				dis[i] = dis[t.i] + g[t.i][i];
				q.push(node(i, dis[i]));
			}
		}	
	}
	return dis[e];
}
int main(){
	int T, cas = 1;
	scanf("%d", &T);
	while(T--){
		memset(g, 0, sizeof(g));
		int eidx = 0;
		scanf("%d %d", &n, &m);
		for(int i = 0; i < m; ++i){
			int u, v, w;
			scanf("%d %d %d", &u, &v, &w);
			g[u][v] = g[v][u] = w;
		}
		int s, e = n, pre = 0, sum = 0, f = 0;
		scanf("%d", &k);
		for(int i = 1; i <= k; ++i){
			scanf("%d", &r[i]);
		}
		for(int i = 1; i <= k - 1; ++i){
			if(!g[r[i]][r[i + 1]]){
				f = 1;
				break;
			}
			sum += g[r[i]][r[i + 1]];
		}
		if(f == 0){
			printf("TEST %d Y %d\n", cas++ ,sum - dijkstra(r[2], e));	
		}else{
			printf("TEST %d N\n", cas++);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值