1009 信道安全(最短路模板)
1009: 信道安全
时间限制: 2 Sec 内存限制: 128 MB提交: 9 解决: 4
[提交][状态][讨论版]
题目描述
输入
输出
样例输入
1
5 7
5 2 100
3 5 80
2 3 70
2 1 50
3 4 90
4 1 85
3 1 70
样例输出
61.200000 第一次写最短路吧用dij;
由于对套路的不熟悉WA好多次最后发现push时变量用错了= =
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=10005;
int n,m;
double d[maxn];
bool vis[maxn];
struct HeapNode
{
double d;
int u;
bool operator<(const HeapNode& chs)const{
return d<chs.d;}
};
struct Edge
{
int u,v;
double w;
};
vector<int> G[maxn];
vector<Edge> edges;
void init()
{
memset(vis,0,sizeof(vis));
memset(d,-inf,sizeof(d));
for(int i=0;i<=maxn;++i) G[i].clear();
edges.clear();
}
void AddEdge(int a,int b,int c)
{
double s=c/100.00;
edges.push_back((Edge){a,b,s});
edges.push_back((Edge){b,a,s});
int num=edges.size();
G[a].push_back(num-2);
G[b].push_back(num-1);
}
void dijkstra()
{
priority_queue<HeapNode> Q;
int i,j,k;
Q.push((HeapNode){1,1});
d[1]=1;
while(!Q.empty()){
HeapNode x=Q.top();Q.pop();
int u=x.u;
if(vis[u]) continue;
vis[u]=1;
if(vis[n]) break;
for(i=1;i<=G[u].size();++i)
{
Edge e=edges[G[u][i-1]];
if(d[e.v]<d[u]*e.w) {d[e.v]=d[u]*e.w;
Q.push((HeapNode){d[e.v],e.v});} //就是这儿害我检查半天原来写的是(e.w,e.v)
}
}
printf("%.6lf\n",d[n]*100);
}
int main()
{
int t,a,b,c;
scanf("%d",&t);
while(t--){init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
scanf("%d%d%d",&a,&b,&c),AddEdge(a,b,c);
dijkstra();
}
return 0;
}