Time Limit: 3 seconds
"A new internet watchdog is creating a stir in Springfield. Mr. X, if that is his real name, has come up with a sensational scoop." |
Kent Brockman
There are n SMTP servers connected by network cables. Each of the m cables connects two computers and has a certain latency measured in milliseconds required to send an email message. What is the shortest time required to send a message from server S to server T along a sequence of cables? Assume that there is no delay incurred at any of the servers.
Input
The first line of input gives the number of cases, N. N test cases follow. Each one starts with a line containing n (2<=n<20000), m (0<=m<50000), S (0<=S<n) and T (0<=T<n). S!=T. The next m lines will each contain 3 integers: 2 different servers (in the range [0, n-1]) that are connected by a bidirectional cable and the latency, w, along this cable (0<=w<=10000).
Output
For each test case, output the line "Case #x:" followed by the number of milliseconds required to send a message from S to T. Print "unreachable" if there is no route from S to T.
Sample Input | Sample Output |
3 2 1 0 1 0 1 100 3 3 2 0 0 1 100 0 2 200 1 2 50 2 0 0 1 | Case #1: 100 Case #2: 150 Case #3: unreachable |
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int v,len;
node *next;
}*Head[20010],tree[100010];
struct node2
{
int val,pos;
bool operator<(const node2 A)const
{
return A.val<val;
}
};
int T,t,ptr,n,m,S,E,f[20010],INF=1e9,vis[20010];
priority_queue<node2> qu;
void AddEdge(int a,int b,int c)
{
tree[ptr].v=b;
tree[ptr].len=c;
tree[ptr].next=Head[a];
Head[a]=&tree[ptr++];
}
void Dijkstra()
{
int i,j,k,ret,pos,v,len;
for(i=0;i<n;i++)
f[i]=INF;
f[S]=0;
node *p;
node2 A;
while(!qu.empty())
qu.pop();
A.val=0;
A.pos=S;
qu.push(A);
for(i=1;i<=n;i++)
{
ret=INF;
while(true)
{
if(qu.empty())
break;
A=qu.top();
if(vis[A.pos]==t)
qu.pop();
else
{
pos=A.pos;
break;
}
}
if(qu.empty())
break;
vis[pos]=t;
p=Head[pos];
while(p)
{
v=p->v;
len=p->len;
if(f[pos]+len<f[v])
{
A.val=f[pos]+len;
A.pos=v;
qu.push(A);
f[v]=f[pos]+len;
}
p=p->next;
}
}
}
int main()
{
int i,j,k,u,v,w;
scanf("%d",&T);
for(t=1;t<=T;t++)
{
scanf("%d%d%d%d",&n,&m,&S,&E);
memset(Head,NULL,sizeof(Head));
ptr=0;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
AddEdge(u,v,w);
AddEdge(v,u,w);
}
Dijkstra();
if(f[E]>=INF)
printf("Case #%d: unreachable\n",t);
else
printf("Case #%d: %d\n",t,f[E]);
}
}