bzoj 2015: [Usaco2010 Feb]Chocolate Giving

来源:互联网 发布:ios安装旧版本软件 编辑:程序博客网 时间:2024/04/27 09:28

→题目链接←

从编号为1的点跑spfa,然后把两个点到1的距离加一起就好了

大水题

#include<iostream>#include<cstdio>#include<vector>#include<queue>using namespace std;struct node{int to,len;int now;};vector<node>v[50050];int n,m,b;bool vis[50050]={false};int Min[50050];queue<node>q;int main(){scanf("%d%d%d",&n,&m,&b);for(int i=0; i<m; i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);node t;t.to=y;t.len=z;v[x].push_back(t);t.to=x;v[y].push_back(t);}for(int i=1; i<=n; i++)Min[i]=200000001;node t;t.now=1;Min[1]=0;vis[1]=true;q.push(t);while(!q.empty()){t=q.front();q.pop();for(int i=0; i<v[t.now].size(); i++){int to=v[t.now][i].to;int len=v[t.now][i].len;if(len+Min[t.now]<Min[to]){Min[to]=len+Min[t.now];if(!vis[to]){vis[to]=true;node t1=t;t1.now=to;q.push(t1);}}}vis[t.now]=false;}for(int i=0; i<b; i++){int x,y;scanf("%d%d",&x,&y);printf("%d\n",Min[x]+Min[y]);}return 0;}