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;
}