zoukankan      html  css  js  c++  java
  • csu 1930 roads(DFS)

    Description

    Once upon a time there was a strange kingdom, the kingdom had n cities which were connected by n directed roads and no isolated city.One day the king suddenly found that he can't get to some cities from some cities.How amazing!The king is petty so he won't build some new roads to improve this situation,but he has superpowers that he can change the direction of any road.To do this,he will gain a certain fatigue value for a certain road.The king didn't want to be too tired.So he want to know what is the smallest amount of fatigue value he will gain on the redirecting of roads so that from every city people can get to any other?

    Input

    The first line contains integer n (3<=n<=100) - amount of cities (and roads) in the king. Next n lines contain description of roads. Each road is described by three integers ai, bi, ci(1<=ai,bi<=n,ai!=bi,1<=ci<=100) - road is directed from city ai to city bi, redirecting it costs ci.

    Output

    Output single integer - the smallest amount of fatigue value the king will gain on the redirecting of roads so that from every city people can get to any other.

    Sample Input

    3
    1 3 1
    1 2 1
    3 2 1
    3
    1 3 1
    1 2 5
    3 2 1
    

    Sample Output

    1
    2
    
    看上去很难,稍加分析可知n个点n条边改变方向后可以连通,只有可能是一个环,所以我们判断反向边和正向边分别的权值总和取个小的就可以了.然后如果我们对每条单向边建一条负权值的反向边,跑一遍DFS就可以了.
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    const int N = 105;
    int mp[N][N];
    int vis[N];
    int cost;
    int n,node;
    void dfs(int u,int pre){
        if(vis[u]==1&&u!=1){
            return;
        }
        vis[u]++;
        if(vis[u]==2&&u==1){
            node = pre;
            return;
        }
        for(int i=1;i<=n;i++){
            if(i==pre) continue;
            if(mp[u][i]&&!vis[i]){
                if(mp[u][i]<0) cost+=mp[u][i];
                dfs(i,u);
            }
            if(mp[u][i]&&vis[i]!=2&&i==1){
                if(mp[u][i]<0) cost+=mp[u][i];
                dfs(i,u);
            }
        }
    }
    int main()
    {
    
        while(scanf("%d",&n)!=EOF){
            cost = 0;
            int sum = 0;
            memset(mp,0,sizeof(mp));
            memset(vis,0,sizeof(vis));
            for(int i=1;i<=n;i++){
                int u,v,w;
                scanf("%d%d%d",&u,&v,&w);
                mp[u][v] = w;
                sum+=w;
                mp[v][u] = -w;
            }
            dfs(1,-1);
            cost=-cost;
            printf("%d
    ",min(sum-cost,cost));
        }
        return 0;
    }
  • 相关阅读:
    sql 2012中获取表的信息,包含字段的描述
    C#如何创建泛型类T的实例
    C# 之 DataReader 和 DataSet 的区别
    C#进阶系列——WebApi 接口参数不再困惑:传参详解
    IIS事件查看器_WebServer事件查看器_帮助查看IIS-Web服务器事件执行日志
    SQL分页查询的几种方式
    freeRTOS中文实用教程3--中断管理之延迟中断处理
    freeRTOS中文实用教程2--队列
    freeRTOS中文实用教程1--任务
    UML和模式应用5:细化阶段(5)---系统顺序图
  • 原文地址:https://www.cnblogs.com/liyinggang/p/7446820.html
Copyright © 2011-2022 走看看