zoukankan      html  css  js  c++  java
  • 千万别点进来,点进来你就哭了(最短路,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;
    }
    
  • 相关阅读:
    自主问题--KMP算法
    题解--luogu--CSP2019.S.Day2.T4--Emiya 家今天的饭
    浅谈——RMQ
    浅谈——LCA
    NOIP(si le)或者CSP初赛之——前序中序后序,前缀中缀后缀
    浅说——查分约束
    浅说——tarjan
    C++ RQNOJ 星门龙跃
    C++ 洛谷 1261:【例9.5】城市交通路网
    刷题
  • 原文地址:https://www.cnblogs.com/tomjobs/p/10617587.html
Copyright © 2011-2022 走看看