题目大意:有n个服务器,m条线将其连接起来了,要求将信息从s服务器送到t服务器,求最短的时间,如果送不到的话,另外输出
解题思路:这题的数量比较大,用邻接矩阵的话会暴,所以用邻接表来表示,具体思路不变
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 100005
#define INF 0x3f3f3f3f
int n,m,s,t;
int head[maxn],next[maxn],u[maxn],v[maxn],w[maxn],d[maxn];
int vis[maxn];
void init() {
scanf("%d%d%d%d",&n,&m,&s,&t);
memset(head,-1,sizeof(head));
for(int e = 1; e <= m; e++) {
scanf("%d%d%d",&u[e],&v[e],&w[e]);
u[e+m] = v[e];v[e+m] = u[e];w[e+m] = w[e];
next[e] = head[u[e]];
head[u[e]] = e;
next[e+m] = head[u[e+m]];
head[u[e+m]] = e+m;
}
}
void spfa(int scr) {
memset(vis,0,sizeof(vis));
for(int i = 0; i < n; i++)
d[i] = INF;
queue<int> q;
d[scr] = 0;
q.push(scr);
int temp ;
while(!q.empty()){
temp = q.front();
q.pop();
vis[temp] = 0;
for(int e = head[temp]; e != -1; e= next[e])
if(d[temp] + w[e] < d[v[e]]) {
d[v[e]] = d[temp] + w[e];
if(!vis[v[e]]) {
vis[v[e]] = 1;
q.push(v[e]);
}
}
}
}
int main() {
int test,mark = 1;
scanf("%d",&test);
while(test--) {
init();
spfa(s);
if(d[t] != INF)
printf("Case #%d: %d\n",mark++,d[t]);
else
printf("Case #%d: unreachable\n",mark++);
}
return 0;
}