Pandaland HDU

来源:互联网 发布:网络信息管理平台 编辑:程序博客网 时间:2024/05/23 02:03

题目传送门

题意:给你m条边,然你从中选择边构成一个权值最小的环。

思路:暴力枚举每一条边然后把两个点设为起点终点然后Dijkstra就可以,不要忘记剪枝。

PS:这个题emmm,很早就想出来了,但是Dijkstra写错了然后找了一天的错脑子是个好东西可惜我没有。

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <fstream>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <sstream>#include <stack>#include <string>#include <vector>#define MAXN 10010#define MAXE 210#define INF 100000000#define MOD 1000000007#define LL long long#define pi acos(-1.0)using namespace std;struct Node {  int x;  int y;  int id;  bool operator<(const Node &p) const {    if (x == p.x)      return y < p.y;    return x < p.x;  }};struct Edge {  int to;  int cost;  bool operator<(const Edge &p) const { return cost > p.cost; }};int dis[MAXN];bool vis[MAXN];vector<Edge> vec[MAXN];set<Node> Set;int cnt;int ans;void dij(int s) {  priority_queue<Edge> que;  for (int i = 0; i <= cnt + 1; ++i) {    dis[i] = INF;  }  dis[s] = 0;  memset(vis, false, sizeof(vis));  que.push((Edge){s, 0});  while (!que.empty()) {    Edge p = que.top();    que.pop();    if (p.cost > ans) {      return;    }    if (dis[p.to] < p.cost) {      continue;    }    if (vis[p.to]) {      continue;    }    vis[p.to] = true;    for (int i = 0; i < vec[p.to].size(); ++i) {      Edge temp = vec[p.to][i];      if (dis[temp.to] > dis[p.to] + temp.cost) {        dis[temp.to] = dis[p.to] + temp.cost;        que.push((Edge){temp.to, dis[temp.to]});      }    }  }}int main() {  std::ios::sync_with_stdio(false);  int T;  cin >> T;  for (int kase = 1; kase <= T; ++kase) {    memset(vec, 0, sizeof(vec));    Set.clear();    int n;    cin >> n;    int x1, y1, x2, y2, cost;    cnt = 0;    for (int i = 0; i < n; ++i) {      cin >> x1 >> y1 >> x2 >> y2 >> cost;      int id1, id2;      if (Set.count((Node){x1, y1})) {        id1 = Set.find((Node){x1, y1})->id;      } else {        cnt++;        Set.insert((Node){x1, y1, cnt});        id1 = cnt;      }      if (Set.count((Node){x2, y2})) {        id2 = Set.find((Node){x2, y2})->id;      } else {        cnt++;        Set.insert((Node){x2, y2, cnt});        id2 = cnt;      }      vec[id1].push_back((Edge){id2, cost});      vec[id2].push_back((Edge){id1, cost});    }    ans = INF;    for (int i = 1; i <= cnt; ++i) {      for (int j = 0; j < vec[i].size(); ++j) {        int temp_cost = vec[i][j].cost;        vec[i][j].cost = INF;        for (int k = 0; k < vec[vec[i][j].to].size(); ++k) {          if (vec[vec[i][j].to][k].to == i) {            vec[vec[i][j].to][k].cost = INF;            break;          }        }        dij(i);        ans = min(ans, temp_cost + dis[vec[i][j].to]);      }    }    cout << "Case #" << kase << ": ";    if (ans >= INF) {      cout << 0 << endl;    } else {      cout << ans << endl;    }  }  return 0;}
原创粉丝点击