千万别点进来,点进来你就哭了(最短路,dijkstra)

Description

PY利用寒假摸鱼时间去了一趟香港吃吃吃,下面就由我介绍一下我遇到的好吃的香港美食。

首先介绍第一家合益泰小食,这家主打肠粉,这家的肠粉特别的正宗,价格非常亲民,口感非常好

公和荳品厂,这家的豆腐花特别好吃,超级嫩,口感又香又滑。

添好运——这是一家港式点心店,我推荐吃这里的糯米鸡和凤爪,口感都非常好,这里的虾饺也很好吃。

不过叉烧包太甜了,甜到我受不了了。

最后推荐一个华星冰室,不能多写了,不然题面写不下了。这里我极力推荐这家店的奶茶,

奶和茶混合的刚刚好的样子,没有以前我喝的以前的奶茶的那种过分甜,一点茶的味道都没有。(喝过很多奶茶,一个个都甜的不得了)

aaaaa.pngbbbbbbbbbbbbbbbb.pngcccccccccccccc.pngddddddddddddddd.pngeeeeeeeeeeeeeeeeeeeeee.png

下面开始PY的香港之行,PY有nn个要去的小吃店,这nn个小吃店被mm条路径联通起来。

PY有11个传送石和n-1n−1个传送石碎片。

PY可以用传送石标记一个小吃店作为根据地。

每当PY吃完一个地点的美食,必须回到根据地(传送石标记的小吃店)休息一段时间,才能去另外一个小吃店。

也就是说你从根据地走去另一个小吃店吃完之后,不需要再走回来,用传送石碎片即可回来。

现在PY想知道他该标记那个小吃店才能让她走最短的路程吃完这nn个小吃店?

请聪明的你思考上述问题,并告诉他所需走的路程总和 和 他该标记那个地点作为根据地。

ps.传送石只能标记一个小吃店。

思路:最短路枚举求和,我一开始用vector邻接表诡异超时,后来改用前向星才过了,莫非是OJ卡vector??

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
 
#define MAXM 10010
#define MAXN 10010

#define INF 1e9
struct Edge
{
	long long to;     //这条边的终点
	long long next;   //下一条边的存储下标
	long long w;      //权值
}edge[MAXM * 2];
 
struct node
{
	long long u,dis;
	node(long long u,long long dis):u(u),dis(dis){}
	bool operator < (const node& rhs)const
	{
		return dis > rhs.dis;
	}
};

long long dis[MAXN];
long long n, m, cnt;           
long long head[MAXN];  
long long vis[MAXN] ;

void Add(long long u, long long v, long long w) 
{  
	edge[cnt].w = w;
	edge[cnt].to = v;
	edge[cnt].next = head[u];
	head[u] = cnt++;    
}
 
long long dijkstra(long long s, long long n) 
{
	priority_queue<node> q;
	q.push(node( s,0 ));
	for(long long i = 1;i<=n;i++)
		dis[i] = INF;
	dis[s] = 0;
	memset(vis,0,sizeof(vis));
	while (!q.empty()) {
		node now = q.top();
		q.pop();
		long long u = now.u;
		long long d = now.dis;
		if(vis[u])
			continue;
		vis[u] = 1;
		for (long long i = head[u]; ~i; i = edge[i].next) 
		{
			long long t = edge[i].to, v = edge[i].w;
			if (!vis[t]&&dis[t] > dis[u] + v) {
				dis[t] = dis[u] + v;
				q.push(node( t,dis[t] ));
			}
		}
	}
	long long ans = 0;
	for (long long i = 1; i <= n; i++)
		ans += dis[i];
	return ans;
//	return dis[n];
}

int main() 
{
	long long u, v, w;  
	while(~scanf("%lld%lld",&n,&m))
	{
		cnt = 0;
		memset(head,-1,sizeof(head));
		for(long long i=1; i<=m; i++) 
		{
			scanf("%lld%lld%lld",&u,&v,&w);
			Add(u, v, w);
			Add(v, u, w);
		}
		long long a,b;
		long long min_p,min_d;
		min_p = 0,min_d = INF;
		for(long long i = 1;i<=n;i++)
		{	
			long long ans = dijkstra(i,n);
			if(min_d>ans)
			{
				min_d = ans;
				min_p = i;
			}
		}
		printf("%lld %lld
",min_d,min_p);
		
	}	
	return 0;
}
原文地址:https://www.cnblogs.com/tomjobs/p/10617587.html