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\n",i,d[v]);
48                 d[v] = d[u] + w;
49                // printf("@@@@@%d\n",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\n",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 }

 

 

  

posted @ 2017-09-11 21:08  ouyang_wsgwz  阅读(288)  评论(0编辑  收藏  举报