点击跟博主一起玩(zuo)耍(si)
题目大意就是让你求某些点到定点的最短路。
最短路相信都不陌生,各种算法也耳熟能详。SPFA算法是解答这个题的最佳算法23333(不要打我)。
注意在这个题中是区分大小写的。也就是说m跟M代表的时两个牧场,这点是最为重要的。其次就是注意不一定所有的牧场都有奶牛,在读入时注意记录那些有奶牛那些没有,避免进行不必要的计算。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define maxn 10000
#define inf 99999999
using namespace std;
struct edge
{
int to,cost;
};
vector<edge>G[maxn];
int turn (char a){
int t=(int)a;
if(t>=97)
{
t=t-71;
return t;
}
else{
t=t-65;
return t;
}
}
void addedge(int from,int to,int cost){
G[from].push_back((edge){to,cost
});
G[to].push_back((edge){from,cost
});
}
int dist[maxn];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
char a,b;
cin>>a>>b;
int cost;
cin>>cost;
int from=turn(b);
int to=turn(a);
addedge(from,to,cost);
}
int s=turn('Z');
bool inq [maxn];
memset(inq ,0,sizeof(inq));
queue<int>que;
inq[s]=1;
fill(dist,dist+72,inf);
dist[s]=0;
que.push(s);
while(!que.empty())
{
int k=que.front();
inq[k]=0;
que.pop();
for(int i=0;i<G[k].size();i++){
edge &e=G[k][i];
if(dist[e.to]>dist[k]+e.cost){
dist[e.to]=dist[k]+e.cost;
inq[e.to]=1;
que.push(e.to);
}
}
}
int minn=inf ,mini;
for(int i=0;i<25;i++){
if(dist[i]<minn){
minn=dist[i];
mini=i;}
}
char c=(char)mini+65;
cout<<c<<" "<<minn;
return 0;
}