现在的位置: 首页 > 算法 > 正文

zoj1655

2019年03月01日 算法 ⁄ 共 970字 ⁄ 字号 评论关闭

//反过来找比较简单

#include <cstdio>

#include <iostream>
#include <string.h>
using namespace std;
double map[110][110];
double weight[110];
double dist[110];
void dijkstar(int sta,int n)
{
int i,j,mark;
double maxi;
bool flag[100];
memset(flag,0,sizeof(flag));
memset(dist,0,sizeof(dist));
flag[sta]=1;
dist[sta]=1;
for(i=1;i<=n;i++)
{
maxi=-1;
for(j=1;j<=n;j++)
{
if(!flag[j])
{
if(map[sta][j]!=-1&&dist[j]<dist[sta]*map[sta][j])
dist[j]=dist[sta]*map[sta][j];
else if(map[sta][j]!=-1&&dist[j]==0)
dist[j]=dist[sta]*map[sta][j];
if(maxi<dist[j]&&dist[j]!=0)
{
mark=j;
maxi=dist[j];
}
}
}
if(maxi==-1)
break;
sta=mark;
flag[sta]=1;
}
}
void output( int n )  
{  
int i;  
double sum;  
sum=0.0;  
for( i=1;i<n;i++ )  
{  
sum+=dist[i]*weight[i];  
}  
printf( "%.2f\n",sum );  
}  
int main ()
{
int n,m,a,b,i,j;
double rate;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=-1;
for(i=1;i<n;i++)
scanf("%lf",&weight[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d%lf",&a,&b,&rate);
if(1-rate>map[a][b])
map[a][b]=map[b][a]=1-rate;
}
dijkstar(n,n);
output(n);
}
return 0;
}

抱歉!评论已关闭.