hdoj 1874 暢通工程續【最短路的3種方法】

來源:互聯網
上載者:User

標籤:

暢通工程續Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 37272    Accepted Submission(s): 13759


Problem Description某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。

現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。 
Input本題目包含多組資料,請處理到檔案結束。
每組資料第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。
接下來是M行道路資訊。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度為X的雙向道路。
再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。 
Output對於每組資料,請在一行裡輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1.
 
Sample Input
3 30 1 10 2 31 2 10 23 10 1 11 2
 
Sample Output
2-1
 
Authorlinle 
Source2008浙大研究生複試熱身賽(2)——全真類比 

/*dijkstra*/#include<cstdio>#include<algorithm>#define MAX 0x3f3f3fusing namespace std;int dis[211],vis[211];int len[211][211];int n,m,s,t;int min(int x,int y){      if(x >= y)            return y;      return x;      }void dijkstra(){      int i,j,k;      for( i = 0; i < n; i++)      {            dis[i] = MAX;            vis[i] = 0;      }                  dis[s] = 0;      while(1)      {            k = -1;            for( i = 0; i < n ; i++)            if(!vis[i] && (k==-1 ||dis[i] < dis[k]))            k = i;            if(k == -1)  break;            vis[k] = 1;            for(i = 0; i < n; i++)            dis[i] = min( dis[i], dis[k]+len[i][k]);      }      if(dis[t] == MAX)            printf("-1\n");      else                  printf("%d\n",dis[t]);}int main(){      int i,j,k,a,b,x;      while(scanf("%d%d",&n,&m)!=EOF)      {            for( i = 0; i < n; i++)            for( j = 0; j < n; j++)            len[i][j] = MAX;            while(m--)            {                  scanf("%d%d%d",&a,&b,&x);                  if(len[a][b] > x)                  {                        len[a][b] = x;                        len[b][a] = x;                  }                  }            scanf("%d%d",&s, &t);            dijkstra();      }      return 0;}/*spfa*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<vector>#define INF 0x3f3f3f#include<algorithm>using namespace std;int n,m;int head[2100],edgenum,dis[2100];bool vis[2100];struct node{      int start,end,len,next;}p[20010];void add(int u,int v,int w){      node E = {u,v,w,head[u]};      p[edgenum] = E;      head[u] = edgenum++;}void spfa(int s,int t){      memset(vis,0,sizeof(vis));      memset(dis,0x3f,sizeof(dis));      queue<int> q;      q.push(s);      dis[s] = 0;      vis[s] = 1;      while(!q.empty())      {            int u = q.front();             q.pop();            vis[u] = 0;            for(int i = head[u]; i!=-1;i=p[i].next)            {                  int v = p[i].end;                  if(dis[v]>dis[u]+p[i].len)                  {                        dis[v]=dis[u]+p[i].len;                        if(!vis[v])                        {                              vis[v] =1;                              q.push(v);                        }                  }            }      }      if(dis[t]>10000)            printf("-1\n");      else                  printf("%d\n",dis[t]);                  }int main(){      int i,j,k;      while(scanf("%d%d",&n,&m)!=EOF)      {            memset(head,-1,sizeof(head));            edgenum = 0;            int a,b,c;            while(m--)            {                  scanf("%d%d%d",&a,&b,&c);                  add(a,b,c);                  add(b,a,c);            }            int s1,e1;            scanf("%d%d",&s1,&e1);            spfa(s1,e1);      }      return 0;}/*floyd*/#include<stdio.h>#include<string.h>#define min(a,b) a>b?b:a#define INF 0x3f3f3f3fint n,m;int dis[211][211];void floyd(){int i,j,k;for(k = 0; k < n; k++)for(i = 0; i < n; i++)for(j = 0; j < n; j++) dis[i][j] = min( dis[i][j], dis[i][k]+dis[k][j] );}int main(){int i,j,k;while(scanf("%d%d",&n,&m)!=EOF){int a,b,x;for(i = 0;i < n; i++){for(j = 0; j < n; j++)if(i==j)dis[i][j] = 0;elsedis[i][j] = INF;}while(m--){scanf("%d%d%d",&a,&b,&x);if(dis[a][b] > x)dis[a][b] = dis[b][a] =x;}int from,to;scanf("%d%d",&from,&to);floyd();if(dis[from][to]==INF)printf("-1\n");elseprintf("%d\n",dis[from][to]);}return 0; } 




著作權聲明:原創文章,若要轉載,請與博主聯絡,謝謝

hdoj 1874 暢通工程續【最短路的3種方法】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.