24h購物| | PChome| 登入
2009-11-26 18:04:02| 人氣822| 回應0 | 上一篇 | 下一篇

2006 NPSC D. 水之都 (重寫 SPFA版)

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

作法 : SPFA

之前所寫的方法是原創的,所以不確定其演算法的正確性!

以下的,用SPFA寫的,再加上優化輸入  所以才可以達到極致

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

#include<stdio.h>
#include<stdlib.h>
#define MAX 1000000000
int map[1001][300][2]={0};
int N,M,S,E;
int input()  
{  
  char cha;  
  int x=0;  
  while(cha=getchar())  
     if(cha!=' '&&cha!='\n') break;  
  x=cha-48;  
  while(cha=getchar())   
    {  
     if(cha==' '||cha=='\n') break;  
      x=x*10+cha-48;  
    }  
    return x;  
}
int min(int x,int y)  
{  
     if(x>=y) return y;  
     else return x;  
}
int max(int x,int y)  
{  
     if(x>=y) return x;  
     else return y;  
}
short Queue[5000000],maptop[1001]={0};
int SPFA(int S,int N,int E)     
{     
   int Dis[1001]={0},a,b,c,used[1001]={0};     
   int top=-1;     
   Dis[S]=MAX;
   for(a=0;a<maptop[S];a++)     
     {     
      Dis[map[S][a][0]]=max(Dis[map[S][a][0]],map[S][a][1]);     
      if(used[map[S][a][0]]==0)
            Queue[++top]=map[S][a][0],used[map[S][a][0]]=1;     
     }     
   for(a=0;a<=top;a++)     
      {     
         int Qp=Queue[a];     
         used[Qp]=0;          
         for(b=0;b<maptop[Qp];b++)     
            {
              int R=min(Dis[Qp],map[Qp][b][1]);
              if(Dis[map[Qp][b][0]]<R)
                {     
                   Dis[map[Qp][b][0]]=R;     
                   if(used[map[Qp][b][0]]==0)     
                     Queue[++top]=map[Qp][b][0],used[map[Qp][b][0]]=1;     
               }     
            }
      }     
   printf("%d\n",Dis[E]);
}    
main()
{
 while(scanf("%d %d",&N,&M)==2&&N)
    {
       int a,b,c,x,y,data;
       for(a=0;a<M;a++)
         {
           x=input(),y=input(),data=input();
           map[x][maptop[x]][0]=y;
           map[x][maptop[x]++][1]=data;
           map[y][maptop[y]][0]=x;
           map[y][maptop[y]++][1]=data;
         }
        scanf("%d %d",&S,&E);
        SPFA(S,N,E);
        for(a=1;a<=N;a++)   maptop[a]=0; 
  }
 return 0;
}

台長: 來源不明
人氣(822) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: NPSC |
此分類下一篇:2008 NPSC H. 幼稚國王的行程 (SPFA版)
此分類上一篇:2008 NPSC H. 幼稚國王的行程

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