[2016-04-02][POJ][1797][Heavy Transportation]

  • 时间:2016-04-02 19:42:38 星期六

  • 题目编号:[2016-04-02][POJ][1797][Heavy Transportation]

  • 题目大意:给定一个图,求起点1到终点n的所有路径中,最大承重值,即所有路径中,承重的最小值的最大值

  • 分析:

  • 方法1:Dijkstra
    • 跑一次Dijkstra,d[v] = max(d[v],min(d[u],a[u][v]));
    • 初始条件:d[s] = INF;
    • 每次应该选择大的点\
    • 这里没判断边是否存在也能过,不过时间是判断了的 5倍
  • 方法2:并查集,最小生成树(此题是最大生成树)
    • 注意这里当1和n想通就可以结束合并了
  1. //Dijkstra
  2. #include <queue>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cstdio>
  6. using namespace std;
  7. const int maxn = 1000 + 10;
  8. const int maxm = maxn * maxn / 2;
  9. struct Node{
  10. int v,c;
  11. Node(int _v = 0,int _c = 0):v(_v),c(_c){}
  12. bool operator < (const Node & a)const {
  13. return c < a.c;
  14. }
  15. };
  16. int vis[maxn],d[maxn],a[maxn][maxn],n,m;
  17. void Dijkstra(int s){
  18. memset(vis,0,sizeof(vis));
  19. memset(d,0x3f,sizeof(d));
  20. priority_queue<Node> q;
  21. d[s] = 0x3f3f3f3f;
  22. q.push(Node(s,0));
  23. Node tmp;
  24. while(!q.empty()){
  25. tmp = q.top();q.pop();
  26. int u = tmp.v;
  27. if(vis[u]) continue;
  28. vis[u] = 1;
  29. for(int i = 1 ; i <= n ; ++i){
  30. if(!vis[i] &&a[u][i]){
  31. d[i] = max((d[i]==0x3f3f3f3f?-1:d[i]),min(d[u],a[u][i]));
  32. q.push(Node(i,d[i]));
  33. }
  34. }
  35. }
  36. }
  37. int main(){
  38. int cntcase = 0,_a,b,c;
  39. int t;
  40. scanf("%d",&t);
  41. while(t--){
  42. scanf("%d%d",&n,&m);
  43. memset(a,0,sizeof(a));
  44. for(int i = 0;i < m ; ++i){
  45. scanf("%d%d%d",&_a,&b,&c);
  46. a[_a][b] = a[b][_a] = c;
  47. }
  48. Dijkstra(1);
  49. printf("Scenario #%d:\n",++cntcase);
  50. printf("%d\n\n",d[n]);
  51. }
  52. return 0;
  53. }

  1. //并查集
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. using namespace std;
  7. const int maxn = 1000 + 10;
  8. const int maxm = maxn * maxn / 2;
  9. int fa[maxn];
  10. struct Point{
  11. int x,y;
  12. }p[maxn];
  13. struct Edge{
  14. int u,v,c;
  15. Edge(int _u = 0,int _v = 0,int _c = 0):u(_u),v(_v),c(_c){}
  16. bool operator < (const Edge & a)const{
  17. return c > a.c;
  18. }
  19. }e[maxm];
  20. void ini(int n){
  21. for(int i = 0;i <= n ; ++i){
  22. fa[i] = i;
  23. }
  24. }
  25. int fnd(int x){
  26. return fa[x] == x?x:fa[x] = fnd(fa[x]);
  27. }
  28. int n,m;
  29. int main(){
  30. int cntcase = 0;
  31. int t;
  32. scanf("%d",&t);
  33. while(t--){
  34. scanf("%d%d",&n,&m);
  35. for(int i = 0;i < m ; ++i){
  36. scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].c);
  37. }
  38. sort(e,e+m);
  39. int ans = 0x3f3f3f3f,f1,f2;
  40. ini(n);
  41. for(int i = 0;i < m ; ++i){
  42. f1 = fnd(e[i].u);
  43. f2 = fnd(e[i].v);
  44. if(f1 != f2){
  45. fa[f1] = f2;
  46. ans = min(ans,e[i].c);
  47. }
  48. if(fnd(1) == fnd(n)) break;
  49. }
  50. printf("Scenario #%d:\n",++cntcase);
  51. printf("%d\n\n",ans);
  52. }
  53. return 0;
  54. }


来自为知笔记(Wiz)


posted on 2016-04-02 20:22  红洋  阅读(107)  评论(0)    收藏  举报

导航