【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104790
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

现在是晚餐时间,而母牛们在外面分散的牧场中。农民约翰按响了电铃,所以她们开始向谷仓走去。你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只速度最快的母牛)。在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。有时,两个牧场(可能是自我相同的)之间会有超过一条道路相连。至少有一个牧场和谷仓之间有道路连接。因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。谷仓的标记是'Z',注意没有母牛在谷仓中。 注意'm'和'M'不是一个牧场

格式
PROGRAM NAME: comehome
INPUT FORMAT
(file comehome.in)

第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。

第 2 ..P+1行: 用空格分开的两个字母和一个整数:

被道路连接牧场的标记和道路的长度(1<=长度<=1000)。

SAMPLE OUTPUT
(file comehome.out)

单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。

SAMPLE INPUT
5
A d 6
B d 3
C e 9
d Z 8
e Z 3

SAMPLE OUTPUT
B 11

【参考程序】:

/*
ID: XIONGNA1
PROG: comehome
LANG: C++
*/
#include
<iostream>
using namespace std;
int cost[53][53],lowcost[53];
bool bo[53];
int n,ans;
void dijkstra()
{
    
int MIN,k;
    
for (int i=1;i<=51;i++)
    {
        MIN
=0xFFFFFFF;
        
for (int j=1;j<=52;j++)
            
if (!bo[j] && lowcost[j]<MIN)
            {
                MIN
=lowcost[j];
                k
=j;
            }
        
if (MIN==0xFFFFFFFreturn ;
        bo[k]
=true;
      
for (int j=1;j<=52;j++)
            
if (!bo[j] && lowcost[j]>lowcost[k]+cost[k][j])
                lowcost[j]
=lowcost[k]+cost[k][j];
    }
}
int main()
{
    freopen(
"comehome.in","r",stdin);
    freopen(
"comehome.out","w",stdout);
    scanf(
"%d",&n);getchar();
    
for (int i=1;i<=52;i++)
        
for (int j=1;j<=52;j++)
            
if (i==j) cost[i][j]=0;
            
else cost[i][j]=0xFFFFFFF;
    
char ch1,t,ch2; int x,y,c;
    
for (int i=1;i<=n;i++)
    {
        scanf(
"%c%c%c%d",&ch1,&t,&ch2,&c);
        
if (ch1>='A' && ch1<='Z') x=(ch1-64);
        
else x=(ch1-96)+26;
        
if (ch2>='A' && ch2<='Z') y=(ch2-64);
        
else y=(ch2-96)+26;
        
if (cost[x][y]>c)//防止重边
        {
            cost[x][y]
=c; cost[y][x]=c;
        }
        getchar();
    }
    
for (int i=1;i<=52;i++)
    {
        lowcost[i]
=cost[26][i];
        bo[i]
=false;
    }
    bo[
26]=true;
    dijkstra();
    
int ans=0xFFFFFFF,p;
    
for (int i=1;i<=25;i++)
        
if (ans>lowcost[i])
        {
            ans
=lowcost[i]; p=i;
        }
    printf(
"%c %d\n",char(p+64),ans);
    
return 0;
}
posted on 2009-07-21 15:22 开拓者 阅读(291) 评论(0)  编辑 收藏 引用 所属分类: 图论算法&例题USACO 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理