Let life be beautiful |

Ginger_he

园龄:3年1个月粉丝:5关注:5

洛谷P7551题解

本文同步更新于洛谷博客

题解

很明显这是最短路的模板,但与其他题不同的是,这道题中点是以字符串的形式出现的。因此我们就想到了 map,可以将字符串映射成一个数。最后注意重复出现的字符串只需映射一次,这道题就解决了。

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1005;
struct node
{
    int v;
    ll w;
    bool operator < (const node &x) const
    {
	return w>x.w;
    }
};
int n,m,q,cnt;
ll t,dis[maxn],ans;
bool vis[maxn];
string a,b;
map<string,ll> mp;
vector<node> g[maxn];
ll dijkstra(int x,int y)
{
    memset(dis,0x3f3f3f3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    priority_queue<node> q;
    q.push(node{x,dis[x]=0});
    while(!q.empty())
    {
        int tmp=q.top().v;
	q.pop();
	if(vis[tmp])
	    continue;
	vis[tmp]=1;
	for(auto i:g[tmp])
	{
	    if(dis[tmp]+i.w<dis[i.v])
	    {
		dis[i.v]=dis[tmp]+i.w;
		q.push(node{i.v,dis[i.v]});
	    }
	}
    }
    return dis[y];
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
	cin>>a>>b>>t;
	mp[a]=mp[a]?mp[a]:++cnt;
	mp[b]=mp[b]?mp[b]:++cnt;
	g[mp[a]].push_back(node{mp[b],t});
    }
    scanf("%d",&q);
    while(q--)
    {
	cin>>a>>b;
	ans=dijkstra(mp[a],mp[b]);
	if(ans==dis[0]) printf("Roger\n");
	else printf("%lld\n",ans);
    }
	return 0;
}

本文作者:Ginger_he

本文链接:https://www.cnblogs.com/Gingerhe/p/15977647.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ginger_he  阅读(59)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起