Tuesday, December 27, 2016

UVA 10986 - Sending email

#include <bits/stdc++.h>
#define sf scanf
#define pf printf
#define inf 1e18
#define MAX 1000000000
using namespace std;
struct Node{
int at , cost;
Node(int _at, int _cost){
at = _at;
cost = _cost;
}
};
bool operator<(Node A , Node B){
return A.cost > B.cost;
}
struct Edge{
int v, w;
Edge(int _v, int _w){
v = _v;
w = _w;
}
};
vector <Edge> adj[20000+1];
priority_queue<Node>PQ;
int dist[20000+1];
int n;

void dijkstra(int s){
for(int i=0; i<=n; i++){
dist[i] = MAX;
}
dist[s] = 0;
PQ.push(Node(s,0));

while(!PQ.empty()){
Node u = PQ.top();
PQ.pop();
if(u.cost != dist[u.at]){
continue;
}
for(Edge e: adj[u.at]){
if(dist[e.v] > u.cost + e.w){
dist[e.v] = u.cost + e.w;
PQ.push(Node(e.v, dist[e.v]));
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
int t,kase=0;
cin >> t;
while(t--){
memset(adj,0,sizeof adj);
while(!PQ.empty())PQ.pop();
  int edges , s , t;
  cin >> n >> edges >> s >>t;
  for(int i=0; i<edges; i++){
  int u , v , w;
  cin >>u >> v >> w;
  adj[u].push_back(Edge(v,w));
  adj[v].push_back(Edge(u,w));
  }
  dijkstra(s);
  if(dist[t] == MAX)cout <<"Case #"<<++kase<<": unreachable\n";
  else cout <<"Case #"<<++kase<<": "<<dist[t]<<'\n';
}



return 0;
}

No comments:

Post a Comment