问题标题: 酷町堂:P2221 WA第三个点

0
0
已解决
李庚午
李庚午
中级守护
中级守护

RT。该代码在Luogu P1629是可以AC的(这两道题一样),但在酷町堂蜜汁WA一个点,求找错。

map处理的确实不是很漂亮,代码可读性较差,如果您能找出错误就太感谢了。

#include<bits/stdc++.h>
#define MAXN 10001
using namespace std;
typedef pair<int,int> P;
struct edge
{
    int to,dist;
};
int n=0,m,s;
vector<edge> G[MAXN];
map<char,int>point;
char sb[MAXN];
bool pd(int x)
{
    if ((sb[x]>='A')&&(sb[x]<'Z')) return true;
    return false;
}
void dijkstra(int s)
{
    int dist[MAXN];memset(dist,127,sizeof(dist));
    priority_queue<P,vector<P>,greater<P> >team;
    team.push(P(0,s));dist[s]=0;

    while(!team.empty())
    {
        P p=team.top();team.pop();
        int v=p.second;
        if (dist[v]<p.first) continue;
        for(int i=0;i<G[v].size();i++)
        {
            edge e=G[v][i];
            if (dist[e.to]>dist[v]+e.dist)
            {
                dist[e.to]=dist[v]+e.dist;
                team.push(P(dist[e.to],e.to));
            }
        }
    }
    int ans=-1;
    for(int i=1;i<=n;i++)
    {
        if ((ans==-1||dist[i]<dist[ans])&&(pd(i))) ans=i;
    }
    cout<<sb[ans]<<" "<<dist[ans];
}
int main()
{
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        char ch1,ch2;int w;
        cin>>ch1>>ch2>>w;
        if (!point[ch1]) {point[ch1]=++n;sb[n]=ch1;}
        if (!point[ch2]) {point[ch2]=++n;sb[n]=ch2;}
        s=ch1=='Z'?point[ch1]:s;
        s=ch2=='Z'?point[ch2]:s;
        G[point[ch1]].push_back((edge){point[ch2],w});
        G[point[ch2]].push_back((edge){point[ch1],w});
    }
    dijkstra(s);
    return 0;
}

您所有不是找错的回答均将我被举报。我不缺可以AC的代码。

李庚午在2018-03-30 20:22:14追加了内容

……发错了。这道题的Luogu题号是1529


1
已采纳
王星河
王星河
资深光能
资深光能

用map反而容易写错。

能够用简单方法解决的问题,就不要做复杂了。

1
贾文卓
贾文卓
高级光能
高级光能

你把dist数组赋值成“127”(实际上是最大的int范围的数,我试过),如果再加上一个正整数不就爆了吗,结果是变为负数!!!

贾文卓在2018-03-30 20:41:37追加了内容

把memset的语句改为fill(dist+1,dist+n+1,INF)即可(INF为自定义的一个很大的数(10^9),最好不要再大了,再大就又要爆了),头文件就是#include<iostream>

1
王星河
王星河
资深光能
资深光能

其实不需要map,数组就可以了。C++中 'A'=65 , 'a'=97 ,以此类推。

0
贾文卓
贾文卓
高级光能
高级光能

@李庚午 我刚才试了一下,虽然不是最大的,但是也很接近了,如果两个“127”加起来,后果...

这是我的个人建议,反正照我那样写应该不会错,因为那样子就算两个INF加起来也爆不掉。

0
0
我要回答