您的位置:首页 > 其它

uva 10246(最短路变形)

2013-09-20 19:26 323 查看
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28972

思路:spfa求出每个点到其余顶点的最短路(最短路上的每个点的val都小于等于起点的val),然后又二维数组dp来保存,最后询问的时候就是枚举中间点i了,min{dp[i][u]+dp[i][v]+cost[i]};

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define inf 1<<30

struct Edge{
int v,w;
Edge(){}
Edge(int vv,int ww):v(vv),w(ww){}
};

vector<vector<Edge> >g;
int cost[111],dist[111],dp[111][111];
bool mark[111];
int n,m,Q;

void spfa(int s)
{
memset(mark,false,sizeof(mark));
fill(dist,dist+n+1,inf);
dist[s]=0;
queue<int>que;
que.push(s);
while(!que.empty()){
int u=que.front();
que.pop();
mark[u]=false;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v,w=g[u][i].w;
if(dist[u]+w<dist[v]&&cost[v]<=cost[s]){
dist[v]=dist[u]+w;
if(!mark[v]){
mark[v]=true;
que.push(v);
}
}
}
}
for(int i=1;i<=n;i++)dp[s][i]=dist[i];
}

int main()
{
int u,v,w,t=0;
while(~scanf("%d%d%d",&n,&m,&Q)){
if(n==0&&m==0&&Q==0)break;
for(int i=1;i<=n;i++)scanf("%d",&cost[i]);
g.clear();
g.resize(n+2);
while(m--){
scanf("%d%d%d",&u,&v,&w);
g[u].push_back(Edge(v,w));
g[v].push_back(Edge(u,w));
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)dp[i][j]=inf;
for(int i=1;i<=n;i++)spfa(i);
if(t)puts("");
printf("Case #%d\n",++t);
while(Q--){
scanf("%d%d",&u,&v);
int ans=inf;
for(int i=1;i<=n;i++){
if(dp[i][u]==inf||dp[i][v]==inf)continue;
ans=min(ans,dp[i][u]+dp[i][v]+cost[i]);
}
if(ans==inf)ans=-1;
printf("%d\n",ans);
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: