2 条题解

  • -2
    @ 2018-12-11 11:59:01
    /*
    
    */
    #define method_2
    #ifdef method_1
    /*
    
    无剪枝 
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int maxn=100+5;
    const int INF=0x3f3f3f3f;
    int n,m;
    int die[maxn];//每个节点的崩塌时间 
    int G[maxn][maxn];
    int ans=INF;
    int vis[maxn];
    void dfs(int x,int now){ //在x节点处 且目前时刻为now 
        if(now>=die[x]){ //不能在毁灭时刻及以后时刻到达 
            return;
        }
        if(x==n){
            ans=min(ans,now);
            return;
        }
    //  if(now>=ans) return; //剪枝 
        for(int i=1;i<=n;i++){
            if(!vis[i]&&G[x][i]!=INF){
                dfs(i,now+G[x][i]);
                vis[i]=0; //回溯 
            }
        }
    }
    int main() {
        ios::sync_with_stdio(false);
        freopen("偷拍硕哥1.in","r",stdin);
        memset(vis,0,sizeof(vis));
        memset(G,INF,sizeof(G));
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>die[i];
        }
        int a,b,c;
        for(int i=1;i<=m;i++){
            cin>>a>>b>>c;
            G[a][b]=min(G[a][b],c);
            G[b][a]=G[a][b];
        }
        dfs(1,0);
        if(ans==INF) cout<<-1;
        else cout<<ans;
        return 0;
    }
    #endif
    #ifdef method_2
    /*
    
    有剪枝 
    */
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int maxn=100+5;
    const int INF=0x3f3f3f3f;
    int n,m;
    int die[maxn];//每个节点的崩塌时间 
    int G[maxn][maxn];
    int ans=INF;
    int vis[maxn];
    void dfs(int x,int now){ //在x节点处 且目前时刻为now 
        if(now>=die[x]){ //不能在毁灭时刻及以后时刻到达 
            return;
        }
        if(x==n){
            ans=min(ans,now);
            return;
        }
        if(now>=ans) return; //剪枝 
        for(int i=1;i<=n;i++){
            if(!vis[i]&&G[x][i]!=INF){
                dfs(i,now+G[x][i]);
                vis[i]=0; //回溯 
            }
        }
    }
    int main() {
        ios::sync_with_stdio(false); 
    //  freopen("偷拍硕哥1.in","r",stdin);
        memset(vis,0,sizeof(vis));
        memset(G,INF,sizeof(G));
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>die[i];
        }
        int a,b,c;
        for(int i=1;i<=m;i++){
            cin>>a>>b>>c;
            G[a][b]=min(G[a][b],c);
            G[b][a]=G[a][b];
        }
        dfs(1,0);
        if(ans==INF) cout<<-1;
        else cout<<ans;
        return 0;
    }
    #endif
    #ifdef method_3
    /*
    
    */
    
    #endif
    
    
  • -5

    /*

    /
    #define method_2
    #ifdef method_1
    /

    无剪枝
    /
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int maxn=100+5;
    const int INF=0x3f3f3f3f;
    int n,m;
    int die[maxn];//每个节点的崩塌时间
    int G[maxn][maxn];
    int ans=INF;
    int vis[maxn];
    void dfs(int x,int now){ //在x节点处 且目前时刻为now
    if(now>=die[x]){ //不能在毁灭时刻及以后时刻到达
    return;
    }
    if(x==n){
    ans=min(ans,now);
    return;
    }
    // if(now>=ans) return; //剪枝
    for(int i=1;i<=n;i++){
    if(!vis[i]&&G[x][i]!=INF){
    dfs(i,now+G[x][i]);
    vis[i]=0; //回溯
    }
    }
    }
    int main() {
    ios::sync_with_stdio(false);
    freopen("偷拍硕哥1.in","r",stdin);
    memset(vis,0,sizeof(vis));
    memset(G,INF,sizeof(G));
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    cin>>die[i];
    }
    int a,b,c;
    for(int i=1;i<=m;i++){
    cin>>a>>b>>c;
    G[a][b]=min(G[a][b],c);
    G[b][a]=G[a][b];
    }
    dfs(1,0);
    if(ans==INF) cout<<-1;
    else cout<<ans;
    return 0;
    }
    #endif
    #ifdef method_2
    /

    有剪枝
    /
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    const int maxn=100+5;
    const int INF=0x3f3f3f3f;
    int n,m;
    int die[maxn];//每个节点的崩塌时间
    int G[maxn][maxn];
    int ans=INF;
    int vis[maxn];
    void dfs(int x,int now){ //在x节点处 且目前时刻为now
    if(now>=die[x]){ //不能在毁灭时刻及以后时刻到达
    return;
    }
    if(x==n){
    ans=min(ans,now);
    return;
    }
    if(now>=ans) return; //剪枝
    for(int i=1;i<=n;i++){
    if(!vis[i]&&G[x][i]!=INF){
    dfs(i,now+G[x][i]);
    vis[i]=0; //回溯
    }
    }
    }
    int main() {
    ios::sync_with_stdio(false);
    // freopen("偷拍硕哥1.in","r",stdin);
    memset(vis,0,sizeof(vis));
    memset(G,INF,sizeof(G));
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    cin>>die[i];
    }
    int a,b,c;
    for(int i=1;i<=m;i++){
    cin>>a>>b>>c;
    G[a][b]=min(G[a][b],c);
    G[b][a]=G[a][b];
    }
    dfs(1,0);
    if(ans==INF) cout<<-1;
    else cout<<ans;
    return 0;
    }
    #endif
    #ifdef method_3
    /

    */

    #endif

  • 1

信息

难度
7
分类
(无)
标签
(无)
递交数
170
已通过
27
通过率
16%
被复制
7
上传者