【信道安全】--->邻接表法
#include <iostream>
#include <algorithm>
#include <map>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
struct node {
int next;
double lu;
}v;
vector<node> a[10001]; //建立动态邻接表
int vis[10001],n,m; //vis 标记数组
double d[10001]; //存放最大安全率
void djs(int x) //(迪杰斯特拉算法 )
{
d[1]=1;
vis[1]=1; //标记起始点已过
for(int j=1;j<=n;j++)
{
for(int i=0;i<a[x].size();i++) //遍历x点所能链接的点
{
v=a[x][i];
if(vis[v.next]==0&&d[x]*v.lu>d[v.next])
{
d[v.next]=v.lu*d[x];
}
}
a[x].clear();
double sum=0;
int g=0;
for(int i=1;i<=n;i++)//找到最大安全率的点
{
if(d[i]>sum&&vis[i]==0)
{
sum=d[i];
g=i;
}
}
x=g; //更新起始点
vis[g]=1; //标记起始点已过
}
}
int main()
{
//printf("%d",max_element(c,c+n)-c);
int t;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x,y;double s;
scanf("%d%d%lf",&x,&v.next,&v.lu);
v.lu/=100;
a[x].push_back(v);
int q=v.next;
v.next=x;
a[q].push_back(v);
}
djs(1);
printf("%.6f\n",100*d[n]);
}
}