2.4.4 Bessie Come Home 回家

版权声明:转载请告知博主并要注明出处嗷~ 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;
}

猜你喜欢

转载自blog.csdn.net/Akatsuki__Itachi/article/details/82533481
今日推荐