这道题其实就是堆优化的Dijkstra。不用堆优化的话是会超时的。
#include<cstdio>
#include<cstdlib>
#define PROBNAME "cgiving"
const int MAXN=50000;
const int MAXM=100000;
const int MAXB=25000;
const int INF=2000*MAXN*2+1;
int n,m,b;
int k,first[MAXN+2],next[MAXM*2+10],head[MAXM*2+10],tail[MAXM*2+10],c[MAXM*2+10];
int q[MAXN+2],rd[MAXN+2],size;
int d[MAXN+2];
void open_file(void)
{
freopen(PROBNAME".in","r",stdin);
freopen(PROBNAME".out","w",stdout);
}
int getint(void)
{
int a;
scanf("%d",&a);
return a;
}
void addedge(int u,int v,int w)
{
k++;
next[k]=first[u];
first[u]=k;
head[k]=u;
tail[k]=v;
c[k]=w;
}
void init(void)
{
n=getint();
m=getint();
b=getint();
for(int i=1;i<=m;i++)
{
int r=getint(),s=getint(),l=getint();
addedge(r,s,l);
addedge(s,r,l);
}
}
void swap(int i, int j) {
int u = q[i];
int v = q[j];
rd[u] = j; rd[v] = i;
q[i] = v; q[j] = u;
}
void up(int i)
{
int j=i/2;
if(j>0&&d[q[i]]<d[q[j]])
{
swap(i,j);
up(j);
}
}
void down(int i)
{
int j=i*2;
if(j+1<=size&&d[q[j]]>d[q[j+1]])
j++;
if(j<=size&&d[q[i]]>d[q[j]])
{
swap(i,j);
down(j);
}
}
void push(int x)
{
q[++size]=x;
rd[x]=size;
up(size);
}
void pop(void)
{
swap(1,size--);
down(1);
}
void dijkstra(void)
{
for(int i=2;i<=n;i++)
{
d[i]=INF;
}
for(int i=1;i<=n;i++)
{
push(i);
}
while(size)
{
int u=q[1];
pop();
for(int e=first[u];e;e=next[e])
{
int v=tail[e];
if(d[v]>d[u]+c[e])
{
d[v]=d[u]+c[e];
up(rd[v]);
}
}
}
}
void solve(void)
{
dijkstra();
}
void output(void)
{
for(int i=1;i<=b;i++)
{
int p=getint(),q=getint();
printf("%d\n",d[p]+d[q]);
}
}
void close_file(void)
{
fclose(stdin);
fclose(stdout);
}
int main()
{
open_file();
init();
solve();
output();
close_file();
return 0;
}