这题水的很彻底,用dijkstra应该也能过,但是我们却理解错题意了,啊啊啊!!!就差这一题啊!应该是dis[y]>dis[x]+dis[x]/2+g[x][y],但我们理解成dis[y]>dis[x]/2+g[x][y]。没有把之前的花费加上。。。。。。。受不了了!!!!!!!!!!
#include<cstring>
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=1005;
const int INF=0x3f3f3f3f;
int g[maxn][maxn];
int vis[maxn],dis[maxn];
void init(int n)
{
memset(g,INF,sizeof(g));
for(int i=0;i<n;i++)g[i][i]=0;
}
int spfa(int from ,int to,int n)
{
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
queue<int> que;
dis[from]=0;
que.push(from);
while(!que.empty()){
int x=que.front();que.pop();
vis[x]=0;
//if(dis[x]==INF)continue;
for(int y=1;y<=n;y++){
if(g[x][y]!=INF&&dis[x]!=INF&&dis[y]>dis[x]+dis[x]/2+g[x][y]){
dis[y]=dis[x]+dis[x]/2+g[x][y];
if(!vis[y]){
vis[y]=1;
que.push(y);
}
}
}
}
//for(int i=1;i<=n;i++)printf("%d:%d\n",i,dis[i]);
return dis[to];
}
int main()
{
freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
init(n);
int from ,to,w;
for(int i=0;i<m;i++){
scanf("%d%d%d",&from ,&to ,&w);
if(g[from][to]>w)
g[from][to]=g[to][from]=w;
}
scanf("%d%d",&from ,&to);
int ans=spfa(from ,to ,n);
printf("%d\n",ans==INF?-1:ans);
}
return 0;
}