您的位置:首页 > 其它

[弱校联萌2016]2016弱校联盟十一专场10.2

2016-10-02 17:22 330 查看
比赛链接:https://www.bnuoj.com/v3/contest_show.php?cid=8520

A.无非两种情况,点在体里和点在体外。在体外分三种情况,分别是到顶点的距离最小、到棱的距离最小、到面的距离最小。坑在long long于是悲催了一发。

#include <bits/stdc++.h>
using namespace std;

typedef pair<int,int> pii;
const int maxn = 100100;
const int inf = 90000000;
int n, m, q;
int u, v;
map<pii,bool> vis;
map<pii,int> dis;
vector<int> G[maxn];

void bfs(int s, int t) {
queue<int> q;
int u, v;
q.push(s); dis[pii(s,s)] = 0; vis[pii(s,s)] = 1;
while(!q.empty()) {
u = q.front(); q.pop();
if(u == t) return;
for(int i = 0; i < G[u].size(); i++) {
v = G[u][i];
dis[pii(u,v)] = dis[pii(v,u)] = 1;
vis[pii(u,v)] = vis[pii(v,u)] = 1;
if(dis.find(pii(s,t)) == dis.end()) {

dis[pii(s,v)] = dis[pii(s,u)] + 1;
dis[pii(v,s)] = dis[pii(u,s)] + 1;
vis[pii(s,v)] = vis[pii(v,s)] = 1;
q.push(v);
}
}
}
}

int main() {
freopen("in", "r", stdin);
while(~scanf("%d%d%d",&n,&m,&q)) {
vis.clear(); dis.clear();
for(int i = 1; i <= n; i++) G[i].clear();
for(int i = 0; i < m; i++) {
scanf("%d%d",&u,&v);
if(vis.find(pii(u,v)) == vis.end()) {
vis[pii(u,v)] = 1;
vis[pii(v,u)] = 1;
G[u].push_back(v);
G[v].push_back(u);
}
}
vis.clear();
int x, y;
for(int i = 0; i < q; i++) {
scanf("%d%d",&x,&y);
if(x == y) puts("0");
else {
if(vis.find(pii(x,y)) != vis.end()) {
printf("%d\n", dis[pii(x,y)]);
}
else {
bfs(x, y);
printf("%d\n", dis[pii(x,y)]);
}
}
}
}
return 0;
}


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