• nyoj1248(阅读理解???)


    海岛争霸

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王。 这是一个由海洋、岛屿和海盗组成的危险世界。杰克船长准备从自己所占领的岛屿A开始征程,逐个去占领每一个岛屿。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。
    杰克船长手头有一张整个海域的海图,上面详细地记录了各个海屿的位置,以及海屿之间的通航路线。但他发现,有的航海路线太危险了,杰克船长的战船很难直接通过,他必须想方设法绕道航行;还有的岛屿根本到达不了。
    杰克船长现在想把航行的危险程度降到最小。具体地来说,就是杰克船长提出若干个询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少。
     
    输入
    第1行: N M 表示有N个岛屿,M条直航路线
    第2~M+1行: A B V 表示从岛屿A到岛屿B的航海路线的危险程度值为V。
    接下面一行 : Q 表示询问的次数。
    之后有Q个行: A B 表示询问从岛屿A 到岛屿B 所经过的航线,危险程度最小值
    1<N≤100 0<M≤500 1≤ Q≤20 0 < V≤1000,
    所有数据都是正整数。输入数据之间有一个空格。
    输出
    对于每个询问,输出占一行,一个整数,表示从岛屿A 到岛屿B 所经过的航线,危险程度最小值;若从岛屿A 无法到达岛屿B,则输出-1。
    样例输入
    10 8
    1 2 5
    1 3 2
    2 3 11
    2 4 6
    2 4 4
    6 7 10
    6 10 5
    10 7 2
    5
    2 3
    1 4
    3 7
    6 7
    8 3
    样例输出
    5
    5
    -1
    5
    -1

    反正各种读不懂题意,后来才恍然算的是所经过的航线中最小的危险值而不是最短路,不是所有路径和!
    可以用排序+并查集,只要合并了一条边后a,b在一个集合里面了就输出当前边的值break就好了(因为升序排列,这就是最小值不必怀疑,即使重边因为较小的排在前面已经合并过了,会忽略掉长的重边)
    也可以用floyd只不过要更改松弛条件,


    UFS:

    #include<bits/stdc++.h>
    using namespace std;
    int f[105];
    struct node
    {
    int s,e,v;
    bool operator<(const node &chs)const{
    return v<chs.v;}
    }N[1005];
    int getf(int v){return f[v]==v?v:f[v]=getf(f[v]);}
    int main()
    {
    int n,m,i,j,k,q;
    while(cin>>n>>m){int a,b,v;
    for(i=0;i<m;++i)
    cin>>N[i].s>>N[i].e>>N[i].v;
    sort(N,N+m);
    cin>>q;
    while(q--){int ans=0;
    for(i=1;i<=n;++i) f[i]=i;
    cin>>a>>b;
    for(i=0;i<m;++i){
    int x=N[i].s,y=N[i].e;
    if(getf(x)!=getf(y)){                        
    f[getf(y)]=getf(x);                     //由于第一次直接写的f[y]=x,没注意到xy并不是祖先这一点导致WA,以后要注意!!!
    }
    if(getf(a)==getf(b)) {cout<<N[i].v<<endl;break;}
    }
    if(i==m) cout<<-1<<endl;
    }
    }
    return 0;
    }

    floyd:

    #include<bits/stdc++.h>
    using namespace std;
    const int inf=999999999;
    int main()
    {
    int e[105][105],n,m,i,j,k,t;
    while(cin>>n>>m){int a,b,v,Q;
    for(i=1;i<=n;++i)
    for(j=1;j<=n;++j) if(i==j) e[i][j]=0; else e[i][j]=inf;
    for(i=1;i<=m;++i){
    cin>>a>>b>>v;
    if(e[a][b]>v) e[a][b]=e[b][a]=v;
    }
    cin>>Q;
    for(k=1;k<=n;k++)
    for(i=1;i<=n;++i)
    for(j=1;j<=n;++j)
    if(e[i][k]!=inf&&e[k][j]!=inf)                     //松弛条件1,这两条边必须存在。2,松弛过后使得从i到j经过的所有航线中的最大航线值降低
    e[i][j]=min(e[i][j],max(e[i][k],e[k][j]));
    while(Q--){cin>>a>>b;
    if(e[a][b]==inf) puts("-1");
    else cout<<e[a][b]<<endl;
    }
    }
    }



  • 相关阅读:
    oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件
    oracle 常用语句
    android udp 无法收到数据 (模拟器中)
    android DatagramSocket send 发送数据出错
    AtCoder ABC 128E Roadwork
    AtCoder ABC 128D equeue
    AtCoder ABC 127F Absolute Minima
    AtCoder ABC 127E Cell Distance
    CodeForces 1166E The LCMs Must be Large
    CodeForces 1166D Cute Sequences
  • 原文地址:https://www.cnblogs.com/zzqc/p/6702955.html
Copyright © 2020-2023  润新知