zoj 1655 Transport Goods(Dijkstra~~)

dijkstra~~~

 

自己想得挺麻烦的,而且一直错,看了某洋的,呃,明白了。。

 

我发现自己写代码都没有好好想想,感觉就是套公式,公式套不了就不会了。笨蛋啊。。。

 

这个需要自己想的,dis里面保存的是 每个城市货物到capital 的 最大 rate。这个想法很好啊。。。。

 

动动脑子吧。。

 

#include <stdio.h> #include <stdlib.h> #include <memory.h> #define N 102 #define F 0.00000000001 double rate[N][N],temp = 0; int wei[N]; int n,m; int input() { int i,j,a,b; double r; temp = 0; for(i=1; i<n; i++) scanf("%d",&wei[i]); wei[n] = 0; for(i=1; i<=n; i++) for(j=1; j<=n; j++) rate[i][j] = -1; for(i=1; i<=m; i++) { scanf("%d%d%lf",&a,&b,&r); if(rate[a][b] < 1.0 - r ) rate[a][b] = rate[b][a] = 1.0 - r; } } void dijkstra() { double dis[N],max; int hash[N],now,j,k; memset(hash,0,sizeof(hash)); memset(dis,0x0000,sizeof(dis)); now = n; dis[now] = 1; hash[now] = 1; for(j=1; j<=n; j++) { for(k=1; k<=n; k++) if( rate[now][k]!=-1 && !hash[k] && dis[k] < dis[now] *rate[k][now] ) { dis[k] = dis[now]*rate[now][k]; } max = 0; for(k=1; k<=n; k++) if( !hash[k] && dis[k] - max > F ) max = dis[now = k]; hash[now] = 1; } for(j=1; j<n; j++) temp += dis[j]*wei[j]; } int main(void) { while( scanf("%d%d",&n,&m)!=EOF ) { input(); dijkstra(); printf("%.2lf/n",temp); } system("pause"); return 0; }  

你可能感兴趣的:(System,input)