#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;
//#define int long long
const int N=1e5+10;
const int INF=0x3f3f3f3f;
struct qnode{
int v,c;
bool operator <(const qnode &r)const{
return c>r.c;
}
};
struct node{
int u,v,nxt,w;
}d[N];
int head[N],tot=0;
void add(int u,int v,int w){
d[tot]={u,v,head[u],w};
head[u]=tot++;
}
map<pair<int,int>,int> mp;
int t,m,ans=0;
void init(){
tot=0;memset(head,-1,sizeof head);
mp.clear();
}
int dis[N],vis[N];
void dj(int st,int n,int cos){
priority_queue<qnode> q;
for(int i=1;i<=n;i++){
dis[i]=INF;vis[i]=0;
}
while(q.size()) q.pop();
q.push({st,0});dis[st]=0;
while(q.size()){
auto tp=q.top();q.pop();
int u=tp.v;
if(vis[u]==1) continue;
vis[u]=1;
if(dis[u]+cos>ans) break;
for(int i=head[u];~i;i=d[i].nxt){
int to=d[i].v;
if(!vis[to]&&dis[to]>dis[u]+d[i].w){
dis[to]=dis[u]+d[i].w;
q.push({to,dis[to]});
}
}
}
}
int main(){
scanf("%d",&t);int cas=0;
while(t--){
scanf("%d",&m);
init();
int indx=0;
for(int i=1;i<=m;i++){
int a,b,c,d,e;scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
if(mp[{a,b}]==0) mp[{a,b}]=++indx;
if(mp[{c,d}]==0) mp[{c,d}]=++indx;
int u=mp[{a,b}],v=mp[{c,d}];
// cout<<u<<" "<<v<<endl;
add(u,v,e);add(v,u,e);
}
ans=INF;
for(int i=0;i<tot;i+=2){
int tp=d[i].w;
d[i].w=d[i+1].w=INF;
// cout<<d[i].u<<" "<<d[i].v<<endl;
dj(d[i].u,indx,tp);
ans=min(dis[d[i].v]+tp,ans);
d[i].w=d[i+1].w=tp;
}
if(ans==INF) ans=0;
printf("Case #%d: %d\n",++cas,ans);
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交