最短路
目前只学了Dijkstra
这个贴讲的很详细:
http://www.wutianqi.com/?p=1890
HDOJ 2544 最短路
http://acm.hdu.edu.cn/showproblem.php?pid=2544
裸的Dij
1 #include<cstdio> 2 #define MAXN 105 3 #define INF 0x3f3f3f3f 4 #define MIN(a,b) (a<b?a:b) 5 int n,m,a,b,x; 6 int map[MAXN][MAXN]; 7 int vis[MAXN]; 8 int dist[MAXN]; 9 void init() 10 { 11 for(int i=1;i<=n;i++) 12 { 13 for(int j=1;j<=n;j++) 14 { 15 if(i==j) map[i][j]=0; 16 else map[i][j]=INF; 17 } 18 } 19 } 20 void Dijkstra() 21 { 22 for(int i=1;i<=n;i++) 23 { 24 dist[i]=map[1][i]; 25 vis[i]=0; 26 } 27 vis[1]=1; 28 int tmp,u=1; 29 for(int i=1;i<=n;i++) 30 { 31 tmp=INF; 32 for(int j=1;j<=n;j++) 33 { 34 if(!vis[j]&&dist[j]<tmp) 35 { 36 tmp=dist[j]; 37 u=j; 38 } 39 } 40 vis[u]=1; 41 if(u==n) return;//找到这个点就可以return了,不用找完 42 for(int j=1;j<=n;j++) 43 { 44 if(!vis[j]&&map[u][j]<INF) 45 { 46 dist[j]=MIN(dist[j],dist[u]+map[u][j]); 47 } 48 } 49 } 50 } 51 int main() 52 { 53 while(scanf("%d%d",&n,&m)!=EOF) 54 { 55 if(n==0&&m==0) break; 56 init(); 57 for(int i=0;i<m;i++) 58 { 59 scanf("%d%d%d",&a,&b,&x); 60 if(map[a][b]>x) 61 { 62 map[a][b]=x; 63 map[b][a]=x; 64 } 65 } 66 Dijkstra(); 67 printf("%d\n",dist[n]); 68 } 69 return 0; 70 }
HDOJ 1874 畅通工程续
http://acm.hdu.edu.cn/showproblem.php?pid=1874
水水更健康...
1 #include<cstdio> 2 #define MAXN 210 3 #define INF 0x3f3f3f3f 4 #define MIN(a,b) (a<b?a:b) 5 int map[MAXN][MAXN]; 6 int dist[MAXN]; 7 int is_in[MAXN]; 8 int n,m,s,e,a,b,x; 9 void init() 10 { 11 for(int i=0;i<n;i++) 12 { 13 for(int j=0;j<n;j++) 14 { 15 if(i==j) map[i][j]=0; 16 else map[i][j]=INF; 17 } 18 dist[i]=INF; 19 is_in[i]=0; 20 } 21 } 22 int Dijkstra() 23 { 24 for(int i=0;i<n;i++) 25 { 26 if(map[s][i]<INF) dist[i]=map[s][i]; 27 } 28 is_in[s]=1; 29 int tmp,u=s; 30 for(int i=0;i<n;i++) 31 { 32 tmp=INF; 33 //zhaodao zuixiao dianhao 34 for(int j=0;j<n;j++) 35 { 36 if(!is_in[j]&&dist[j]<tmp) 37 { 38 tmp=dist[j]; 39 u=j; 40 } 41 } 42 is_in[u]=1; 43 if(u==e) return 1; 44 for(int j=0;j<n;j++) 45 { 46 if(!is_in[j]&&map[u][j]<INF) 47 { 48 dist[j]=MIN(dist[j],dist[u]+map[u][j]); 49 } 50 } 51 } 52 return 0; 53 } 54 int main() 55 { 56 while(scanf("%d%d",&n,&m)!=EOF) 57 { 58 init(); 59 for(int i=0;i<m;i++) 60 { 61 scanf("%d%d%d",&a,&b,&x); 62 if(x<map[a][b]) 63 { 64 map[a][b]=x; 65 map[b][a]=x; 66 } 67 } 68 scanf("%d%d",&s,&e); 69 Dijkstra(); 70 if(dist[e]<INF) printf("%d\n", dist[e]); 71 else printf("-1\n"); 72 } 73 return 0; 74 }
持续更新中...