1. 程式人生 > >hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)

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

col cti name from .com main 技術 const int

最開始一直想著最短路,不過看完題解後,才知道可以做成最長路。唉,還是太菜了。

先上圖:

技術分享

只要自己添加兩個點,然後如此圖般求最長路即可,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 }

  

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