HDU 6582 Path


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 244    Accepted Submission(s): 50

Problem Description

Years later, Jerry fell in love with a girl, and he often walks for a long time to pay visits to her. But, because he spends too much time with his girlfriend, Tom feels neglected and wants to prevent him from visiting her.
After doing some research on the neighbourhood, Tom found that the neighbourhood consists of exactly  n houses, and some of them are connected with directed road. To visit his girlfriend, Jerry needs to start from his house indexed 1 and go along the shortest path to hers, indexed n
Now Tom wants to block some of the roads so that Jerry has to walk longer to reach his girl's home, and he found that the cost of blocking a road equals to its length. Now he wants to know the minimum total cost to make Jerry walk longer.
Note, if Jerry can't reach his girl's house in the very beginning, the answer is obviously zero. And you don't need to guarantee that there still exists a way from Jerry's house to his girl's after blocking some edges.
 

Input

The input begins with a line containing one integer  T(1T10), the number of test cases.
Each test case starts with a line containing two numbers n,m(1n,m10000), the number of houses and the number of one-way roads in the neighbourhood.
m lines follow, each of which consists of three integers x,y,c(1x,yn,1c109), denoting that there exists a one-way road from the house indexed x to y of length c.
 

Output

Print  T lines, each line containing a integer, the answer.

 

Sample Input

1
3 4
1 2 1
2 3 1
1 3 2
1 3 3
 

Sample Output

3
 

Source

 

Recommend

We have carefully selected several similar problems for you:   6590  6589  6588  6587  6586 

 

吐槽

  這么過分,一定要發朋友圈博客。杭電多校第一場(見上面那個source),AC 1 題收場,就是這題。下兩場可以休息了。本來第四題二分(https://www.cnblogs.com/wawcac-blog/p/11229277.html)也不難,但自己就是想不到。感覺自己現在還只會做板題。別人覺得難度更低的題,我就是想不出來。CF還是要接着打啊……

題意

  原題在這https://www.cnblogs.com/wawcac-blog/p/7012556.html,上學路線的第二問,思路也在那了。只是數據范圍增大了20倍,於是把Floyd改成dijkstra,幾個int改成long long。理論上dinic是要T的,但它就是AC了……

源代碼

  1 #include <queue>
  2 #include <stdio.h>
  3 #include <string.h>
  4 #include <algorithm>
  5 
  6 int T;
  7 int n, m;
  8 
  9 struct Edge
 10 {
 11     int nxt, to;
 12     long long w;
 13 } e[10010], f[10010];
 14 int cnt = 1, head[10010], fcnt = 1, fhead[10010]; //正向圖與反向圖
 15 void add(int u, int v, long long w)
 16 {
 17     e[cnt] = {head[u], v, w};
 18     head[u] = cnt++;
 19     f[fcnt] = {fhead[v], u, w};
 20     fhead[v] = fcnt++;
 21 }
 22 
 23 long long dis[10010], fdis[10010];
 24 bool vis[10010];
 25 struct DijkHeap
 26 {
 27     int u;
 28     long long d;
 29     bool operator<(const DijkHeap &a) const
 30     {
 31         return d > a.d;
 32     }
 33 } dijktemp;
 34 void dijkstra()
 35 {
 36     std::priority_queue<DijkHeap> q;
 37     memset(dis, 0x7f, sizeof(long long) * (n + 2));
 38     memset(vis, 0, sizeof(bool) * (n + 2));
 39     dis[1] = 0;
 40     q.push({1, 0});
 41     while (!q.empty())
 42     {
 43         dijktemp = q.top();
 44         q.pop();
 45         int u = dijktemp.u;
 46         long long d = dijktemp.d;
 47         vis[u] = 1;
 48         for (int i = head[u]; i; i = e[i].nxt)
 49         {
 50             int v = e[i].to;
 51             if (vis[v])
 52                 continue;
 53             if (dis[v] > e[i].w + d)
 54             {
 55                 dis[v] = e[i].w + d;
 56                 q.push({v, dis[v]});
 57             }
 58         }
 59     }
 60 
 61     memset(fdis, 0x7f, sizeof(long long) * (n + 2));
 62     memset(vis, 0, sizeof(bool) * (n + 2));
 63     fdis[n] = 0;
 64     q.push({n, 0});
 65     while (!q.empty())
 66     {
 67         dijktemp = q.top();
 68         q.pop();
 69         int u = dijktemp.u;
 70         long long d = dijktemp.d;
 71         vis[u] = 1;
 72         for (int i = fhead[u]; i; i = f[i].nxt)
 73         {
 74             int v = f[i].to;
 75             if (vis[v])
 76                 continue;
 77             if (fdis[v] > f[i].w + d)
 78             {
 79                 fdis[v] = f[i].w + d;
 80                 q.push({v, fdis[v]});
 81             }
 82         }
 83     }
 84 }
 85 
 86 struct WEdge//最短路圖
 87 {
 88     int nxt, to;
 89     long long flow;
 90 } we[20010];
 91 int whead[10010] = {0}, wcnt = 2;
 92 void wadd(int u, int v, long long f)
 93 {
 94     we[wcnt] = {whead[u], v, f};
 95     whead[u] = wcnt++;
 96     we[wcnt] = {whead[v], u, 0};
 97     whead[v] = wcnt++;
 98 }
 99 
100 int dep[10010] = {0};
101 bool bfs()
102 {
103     memset(dep, 0, sizeof(int) * (n + 2));
104     std::queue<int> q;
105     dep[1] = 1;
106     q.push(1);
107     while (!q.empty())
108     {
109         int u = q.front();
110         q.pop();
111         for (int i = whead[u]; i; i = we[i].nxt)
112         {
113             long long v = we[i].to;
114             if (!dep[v] && we[i].flow)
115             {
116                 dep[v] = dep[u] + 1;
117                 q.push(v);
118             }
119         }
120     }
121     return dep[n] != 0;
122 }
123 
124 long long dfs(int u, long long fflow)
125 {
126     if (u == n || fflow == 0LL)
127         return fflow;
128     long long sum = 0;
129     for (int i = whead[u]; i; i = we[i].nxt)
130     {
131         int v = we[i].to;
132         if (dep[v] == dep[u] + 1 && we[i].flow)
133         {
134             long long delta = dfs(v, std::min(fflow - sum, we[i].flow));
135             sum += delta;
136             we[i].flow -= delta;
137             we[i ^ 1].flow += delta;
138             if (fflow <= sum)
139                 break;
140         }
141     }
142     if (!sum)
143         dep[u] = -1;
144     return sum;
145 }
146 
147 long long dinic()
148 {
149     long long ans = 0;
150     while (bfs())
151     {
152         while (long long temp = dfs(1, 0x7f7f7f7f7f7f7f7f))
153             ans += temp;
154     }
155     return ans;
156 }
157 
158 void init()
159 {
160     cnt = fcnt = 1;
161     wcnt = 2;
162     memset(head, 0, sizeof(int) * (n + 2));
163     memset(fhead, 0, sizeof(int) * (n + 2));
164     memset(whead, 0, sizeof(int) * (n + 2));
165 }
166 
167 int main()
168 {
169     //freopen("test.in","r",stdin);
170     scanf("%d", &T);
171     while (T--)
172     {
173         init();
174         scanf("%d%d", &n, &m);
175         for (int i = 1, u, v, w; i <= m; i++)
176         {
177             scanf("%d%d%d", &u, &v, &w);
178             add(u, v, (long long)w);
179         }
180         dijkstra();
181         for (int u = 1; u <= n; u++)
182         {
183             for (int i = head[u]; i; i = e[i].nxt)
184             {
185                 int v = e[i].to;
186                 if (dis[u] + e[i].w + fdis[v] == dis[n])
187                 {
188                     wadd(u, v, e[i].w);
189                     //printf("***%d   %d   %lld\n", u, v, e[i].w);
190                 }
191             }
192         }
193         printf("%lld\n", dinic());
194     }
195     return 0;
196 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM