sicily 1784. Road Toll

//应用Dijkstra算法,分别以扣费后剩下的钱,和扣费的数额作为路径计量

#include<iostream>            //Dijkstra算法
#include<stdio.h>
#include
<cstring>
using namespace std;
double table[110][110],ans[110]; //ans[]记录从起点到该点扣完费后剩下的最大钱数
bool S[110];
int main()
{
int cases,n,a,b,i,j;
cin
>>cases;
while(cases--)
{
cin
>>n>>a>>b;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
cin
>>table[i][j];
memset(ans,
0,sizeof(ans));
ans[a]
=1;
memset(S,
0,sizeof(S));
int u;
for(i=1;i<=n;++i) //循环次数为全部顶点数n
{
double Max=-1.0;
for(j=1;j<=n;++j)
if(!S[j]&&ans[j]>Max)
{
u
=j;Max=ans[j];
}
S[u]
=1;
if(u==b)
{
printf(
"%.2f\n",ans[b]);
break;
}
for(j=1;j<=n;++j)
if(S[j]==0&&ans[j]<ans[u]*(1-table[u][j]))
{
ans[j]
=ans[u]*(1-table[u][j]);
}
}
}
return 0;
}

  

#include<iostream>            //Dijkstra算法
#include<stdio.h>
#include
<cstring>
using namespace std;
double table[110][110],ans[110]; //ans[]记录从起点到该点扣完费后剩下的最大钱数
bool S[110];
int main()
{
int cases,n,a,b,i,j;
cin
>>cases;
while(cases--)
{
cin
>>n>>a>>b;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
cin
>>table[i][j];
memset(ans,
0,sizeof(ans));
ans[a]
=1;
memset(S,
0,sizeof(S));
int u;
for(i=1;i<=n;++i) //循环次数为全部顶点数n
{
double Max=-1.0;
for(j=1;j<=n;++j)
if(!S[j]&&ans[j]>Max)
{
u
=j;Max=ans[j];
}
S[u]
=1;
if(u==b)
{
printf(
"%.2f\n",ans[b]);
break;
}
for(j=1;j<=n;++j)
if(S[j]==0&&ans[j]<ans[u]*(1-table[u][j]))
{
ans[j]
=ans[u]*(1-table[u][j]);
}
}
}
return 0;
}

  

posted on 2011-07-14 19:13  sysu_mjc  阅读(170)  评论(0编辑  收藏  举报

导航