#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#define min(a,b) (a<b ? a:b)
using namespace std;
const int INF=10e8;
const int MaxN=1010;
struct Node
{
int v,val;
Node(int _v=0,int _val=0):v(_v),val(_val){}
bool operator <(const Node &a)const
{
return val<a.val;
}
};
struct Edge
{
int v,cost;
Edge(int _v,int _cost):v(_v),cost(_cost){}
};
vector<Edge>E[MaxN];
void dijkstra(int lowcost[],int n,int start)
{
priority_queue<Node>que;
Node q;
int len;
int u,v,cost;
for(int i=1;i<=n;i++)
{
lowcost[i]=0;
}
lowcost[start]=INF;
que.push(Node(start,INF));
while(!que.empty())
{
q=que.top();
que.pop();
u=q.v;
len=E[u].size();
for(int i=0;i<len;i++)
{
v=E[u][i].v;
cost=E[u][i].cost;
if(min(cost,lowcost[u])>lowcost[v])
{
lowcost[v]=min(cost,lowcost[u]);
que.push(Node(v,lowcost[v]));
}
}
}
}
inline void addEdge(int u,int v,int c)
{
E[u].push_back(Edge(v,c));
}
int ans[MaxN];
int main()
{
int t,casee=1,a,b,c,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
E[i].clear();
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
addEdge(a,b,c);
addEdge(b,a,c);
}
dijkstra(ans,n,1);
printf("Scenario #%d:\n",casee++);
printf("%d\n\n",ans[n]);
}
return 0;
}
【POJ1797】Heavy Transportation【dijkstra优化】
最新推荐文章于 2020-10-05 16:44:01 发布