版权声明:转载请告知博主并要注明出处嗷~ https://blog.csdn.net/Akatsuki__Itachi/article/details/82533481
Description
现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只速度最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是自我相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。
Input
第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。 第 2 ..P+1行: 用空格分开的两个字母和一个整数: 被道路连接牧场的标记和道路的长度(1<=长度<=1000)。
Output
单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。
Sample Input
5
A d 6
B d 3
C e 9
d Z 8
e Z 3
Sample Output
B 11
刷一刷水题找点自信。。。
细节:无向图,有重边,可以以Z为终点跑一次最短路,也可以以A-Y为起点跑25次最短路。
(我当然要写跑25次的了哈哈哈
邻接矩阵和SPFA邻接表都献上...
//邻接矩阵版
/*#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define memset(a,v) memset(a,v,sizeof(a))
#define eps 1.0E-8
using namespace std;
const int MAXL(1e4);
const int INF(0x3f3f3f3f);
const int mod(1e9+7);
typedef long long int LL;
struct node
{
int to,next,w;
node() {}
node(int to,int next,int w) : to(to),next(next),w(w) {}
} edge[MAXL+50];
int head[MAXL+50];
int cnt=0;
int visit[100];
int is[100];
int dis[100];
int mp[100][100];
int dijkstra(int sc)
{
int i,j,pos=1,mi,sum=0;
memset(visit,0);
for(i=1; i<=52; i++)
{
dis[i]=mp[sc][i];
}
visit[sc]=1;
dis[sc]=0;
int T=52-1;
while(T--)
{
mi=INF;
for(j=1; j<=52; j++)
{
if(visit[j]==0&&mi>dis[j])
{
mi=dis[j];
pos=j;
}
}
visit[pos]=1;
for(j=1; j<=52; j++)
{
if(visit[j]==0&&dis[j]>mi+mp[pos][j])
dis[j]=mp[pos][j]+mi;
}
}
return dis[26];
}
int main()
{
memset(mp,INF);
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
char ch1,ch2;
int x,y,w;
cin>>ch1>>ch2>>w;
if(ch1>='a'&&ch1<='z')
x=ch1-'a'+27;
if(ch1>='A'&&ch1<='Z')
x=ch1-'A'+1,is[x]=1;
if(ch2>='a'&&ch2<='z')
y=ch2-'a'+27;
if(ch2>='A'&&ch2<='Z')
y=ch2-'A'+1,is[y]=1;
mp[x][y]=min(mp[x][y],w);
mp[y][x]=min(mp[y][x],w);
}
int ans=INF;
char ch;
for(int i=1; i<=25; i++)
{
if(!is[i]) continue;
int temp=dijkstra(i);
if(temp<ans)
ch=i-1+'A',ans=temp;
}
cout<<ch<<" "<<ans<<endl;
}
*/
//邻接表版
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define memset(a,v) memset(a,v,sizeof(a))
#define eps 1.0E-8
using namespace std;
const int MAXL(1e4);
const int INF(0x3f3f3f3f);
const int mod(1e9+7);
typedef long long int LL;
struct node
{
int to,next,w;
node() {}
node(int to,int next,int w) : to(to),next(next),w(w) {}
} edge[2*MAXL+50];
int head[2*MAXL+50];
int cnt=0;
int vis[100];
int is[100];
int dis[100];
void add_edge(int x,int y,int z)
{
edge[cnt]=node(y,head[x],z);
head[x]=cnt++;
}
int SPFA(int st)
{
queue<int>q;
memset(vis,0);
memset(dis,INF);
q.push(st);
dis[st]=0;
vis[st]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].to,w=edge[i].w;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v])
q.push(v),vis[v]=1;
}
}
}
return dis[26];
}
int main()
{
memset(head,-1);
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
char ch1,ch2;
int x,y,w;
cin>>ch1>>ch2>>w;
if(ch1>='a'&&ch1<='z')
x=ch1-'a'+27;
if(ch1>='A'&&ch1<='Z')
x=ch1-'A'+1,is[x]=1;
if(ch2>='a'&&ch2<='z')
y=ch2-'a'+27;
if(ch2>='A'&&ch2<='Z')
y=ch2-'A'+1,is[y]=1;
add_edge(x,y,w);
add_edge(y,x,w);
}
int ans=INF;
char ch;
for(int i=1; i<=25; i++)
{
if(!is[i]) continue;
int temp=SPFA(i);
if(temp<ans)
ch=i-1+'A',ans=temp;
}
cout<<ch<<" "<<ans<<endl;
}