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
1
贾文卓
高级光能
高级光能
你把dist数组赋值成“127”(实际上是最大的int范围的数,我试过),如果再加上一个正整数不就爆了吗,结果是变为负数!!!
贾文卓在2018-03-30 20:41:37追加了内容
把memset的语句改为fill(dist+1,dist+n+1,INF)即可(INF为自定义的一个很大的数(10^9),最好不要再大了,再大就又要爆了),头文件就是#include<iostream>
1
0
贾文卓
高级光能
高级光能
@李庚午 我刚才试了一下,虽然不是最大的,但是也很接近了,如果两个“127”加起来,后果...
这是我的个人建议,反正照我那样写应该不会错,因为那样子就算两个INF加起来也爆不掉。
0
0