• hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)


    最开始一直想着最短路,不过看完题解后,才知道可以做成最长路。唉,还是太菜了。

    先上图:

    只要自己添加两个点,然后如此图般求最长路即可,emmm,用SPFA可以,迪杰斯特拉也可以,或者别的都ok,只要通过一次即可。

    上代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <vector>
     4 #include <queue>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn= 100005;
     9 int n;
    10 int a[maxn];
    11 int d[maxn];
    12 struct node{
    13     int u,v,d;
    14     node(int u1=0,int v1=0,int d1=0):u(u1),v(v1),d(d1){}    //重载 
    15 };
    16 
    17 vector<node>edges;
    18 vector<int>g[maxn];
    19 
    20 void add(int u,int v,int w){
    21     edges.push_back(node(u,v,w));
    22     g[u].push_back((int)edges.size()-1);
    23 }
    24 
    25 bool vis[maxn];    //记录是否访问过 
    26 int cnt[maxn];
    27 queue<int>q;
    28 
    29 void spfa(){
    30     memset(vis,0,sizeof(vis));
    31     memset(cnt,0,sizeof(cnt));
    32     while(!q.empty()){
    33         q.pop();
    34     }
    35     vis[0]=1;
    36     cnt[0]=1;
    37     memset(d,0,sizeof(d));
    38     q.push(0);
    39     while(!q.empty()){
    40         int u=q.front();q.pop();
    41         vis[u]=0;
    42         for(int i=0;i<g[u].size();i++){
    43             int id=g[u][i];
    44             int v=edges[id].v;
    45             int w=edges[id].d;
    46             if(d[v] < d[u] + w){
    47                 //printf("@@%d %d
    ",i,d[v]);
    48                 d[v] = d[u] + w;
    49                // printf("@@@@@%d
    ",d[v]); 
    50                 if(!vis[v]){
    51                     vis[v]=1;
    52                     cnt[v]++;
    53                     q.push(v);
    54                     if(cnt[v] > n)
    55                     return;
    56                 }
    57             }
    58         }
    59     }
    60     printf("%d
    ",d[n+1]);
    61 }
    62 
    63 int main(){
    64     int t;
    65     scanf("%d",&t);
    66     while(t--){
    67         scanf("%d",&n);
    68         edges.clear();
    69         for(int i=1;i<=n;i++){
    70             scanf("%d",&a[i]);
    71             g[i].clear();
    72         }
    73         
    74         for(int i=1;i<=n;i++){
    75             add(0,i,a[i]);
    76             add(i,n+1,-a[i]);
    77         }
    78         for(int i=1;i<n;i++){
    79             int u,v,w;
    80             scanf("%d%d%d",&u,&v,&w);
    81             add(u,v,-w);
    82             add(v,u,-w);
    83         }
    84         spfa();
    85     }
    86     return 0;
    87 }

      

  • 相关阅读:
    Ios开发中UILocalNotification实现本地通知实现提醒功能
    Oracle 客户端连接时报ORA-01019错误总结
    linux中合并多个文件内容到一个文件的例子
    java截取字符串函数
    springcloud 笔记
    Aop笔记
    SpringMvc返回Json调试
    jackjson-databind-2.9.3 笔记
    MyBatis 笔记
    Jvm 10 升级笔记
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/7507136.html
Copyright © 2020-2023  润新知