#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int maxn=1e3+10;
const int INF=1e8;
int n,m,q,k,x,y,w,s,e;
int dis[maxn],vis[maxn];
struct P
{
int d,u;//只定义距离d和到达的点u
P(int a,int b)
{
u=a;
d=b;
}
bool operator<(const P & a) const//按照权值大小排序
{
return d>a.d;
}
};
vector<P> edge[maxn];//用vector存边比数组要更优秀
void dijkstra(int s)
{
priority_queue<P> q;
for(int i=0; i<=n; i++) dis[i]=INF;
dis[s]=0;
memset(vis,0,sizeof(vis));
q.push((P){s,0});
while(!q.empty())
{
P x=q.top();
q.pop();
if(vis[x.u]) continue;
vis[x.u]=1;
for(int i=0; i<edge[x.u].size(); i++)
{
P y=edge[x.u][i];
if(dis[y.u]>x.d+y.d)
{
dis[y.u]=x.d+y.d;
q.push(P(y.u,dis[y.u]));
}
}
}
printf("%d\n",dis[e]);
}
int main()
{
while(scanf("%d%d%d",&n,&m,&q) && n)
{
for(int i=0; i<=n; i++) edge[i].clear();
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&w);
edge[x].push_back(P(y,w));//无向图要存xyw和yxw
edge[y].push_back(P(x,w));
}
for(int i=1; i<=q; i++)
{
scanf("%d%d",&s,&e);//输入起点和终点
dijkstra(s);
}
}
return 0;
}
、、、现在才看队列优化的