ZOJ Problem Set - 1655 Transport Goods
结题报告:
一开始用的是从首都向其他城市搜索,记录路径,然后向回搜索,但是出现了wa。
后来搜了一下结题报告,别人都是直接搜索,使费用率最大,试了一下,这样做还是wa
最后看了 小媛 的,才知道是可能同时出现费用率不同的同一条路,这是后我们当然要选择费用率较小的
感觉自己第一遍记录路径代码可以过!,但是细节没有注意
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 105
#define INF 1000000000.0
#define MIN 0.000001
double rate[maxn][maxn];//城市间的费用率
double weight[maxn];//每个城市可以送的物资
double dist[maxn];
int S[maxn];
int n, m;
void Dijkstra( int v0 )
{
int i, j;
for( i = 1; i <= n; i++ )
{
dist[i] = rate[v0][i]; S[i] = 0;
}
S[v0] = 1; dist[v0] = 1;
for( i = 1; i < n; i++ )
{
double max = -1.0;
int u = v0;
for( j = 1; j <= n; j++ )
{
if( !S[j] && (dist[j] - max) > MIN )
{
u = j;
max = dist[j];
}
}
S[u] = 1;
for( j = 1; j <= n; j++ )
{
if( !S[j] && rate[u][j] > MIN && (dist[u]*rate[u][j] - dist[j]) > MIN)
dist[j] = dist[u]*rate[u][j];
}
}
}
int main( )
{
int i, j, u, v;
double w, ans;
while(scanf("%d%d", &n, &m) != EOF )
{
ans =0;
for(i = 1; i < n; i++ )
{
scanf("%lf", &weight[i]);
}
for( i = 1; i <= n; i++ )
{
for( j = 1; j <= n; j++ )
{
rate[i][j] = 0.0;
}
}
for( i = 1; i <= m; i++ )
{
scanf("%d%d%lf", &u, &v, &w);
if(rate[u][v] < 1.0 - w)
rate[u][v] = rate[v][u] = (1.0-w);
}
Dijkstra( n );
for( i = 1; i < n; i++ )
{
ans += weight[i]*dist[i];
}
printf("%.2lf\n", ans);
}
return 0;
}
//没想到最后竟然是可能存在重合的边,但是比率大小不同