24h購物| | PChome| 登入
2009-06-01 06:52:50| 人氣514| 回應0 | 上一篇 | 下一篇

ACM 11015 Q11015: 05-2 Rendezvous

推薦 0 收藏 0 轉貼0 訂閱站台

作法:最短路徑問題

想法:假設每一點是,做最短路徑,總和最小即是

/**********************************************************/

#include<stdio.h>
#include<stdlib.h>
int map[30][30][2]={0};
int n,m,start,end,time=0;
main()
{
 while(scanf("%d %d",&n,&m)==2&&n!=0)
  {
   int a,b,c,x,y,data,maptop[1001]={0};
   char name[22][20]={0};
    for(a=1;a<=n;a++)
     scanf("%s",&name[a]);
    for(a=0;a<m;a++)
     {
      scanf("%d %d %d",&x,&y,&data);
      map[x][maptop[x]][0]=y;
      map[x][maptop[x]][1]=data;
      maptop[x]++;
      map[y][maptop[y]][0]=x;
      map[y][maptop[y]][1]=data;
      maptop[y]++;
     }
    int min=2147483647,ans;
    for(start=1;start<=n;start++)
    {
     int flag[1001]={0},way[1001]={0},find=0;
     flag[start]=1;
     for(a=1;a<=n;a++) way[a]=2147483647;
     way[start]=0;
     for(a=1;a<=n;a++)
      for(b=1;b<=n;b++)
        for(c=0;c<maptop[b];c++)
          if(flag[map[b][c][0]]==1)
            {
              int temp=(way[map[b][c][0]]+map[b][c][1]);
              way[b]=(temp<way[b])?temp:way[b];
              flag[b]=1;
            }   
       int sum=0;
       for(a=1;a<=n;a++) sum=sum+way[a];
       if(sum<min) {min=sum;ans=start;}
     }
     printf("Case #%d : %s\n",++time,name[ans]);
  }
 return 0;
}

台長: 來源不明
人氣(514) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 11579 11579 - Triangle Trouble
此分類上一篇:ACM 544 Heavy Cargo

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文