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