51nod 1442 士兵的旅行

拆点,因为只能走一步,那么u->v 后就不能到k了,这样,建图就能保证只走一步;

  1 #include <bits/stdc++.h>
  2
  3 using namespace std;
  4
  5 const int maxn = 105*2;
  6 const int INF = 0x3f3f3f3f;
  7
  8 struct Edge {
  9     int from,to,cap,flow;
 10 };
 11
 12 struct Dinic
 13 {
 14     int n,m,s,t;
 15     vector<Edge> edge;
 16     vector<int> G[maxn];
 17     bool vis[maxn];
 18     int d[maxn];
 19     int cur[maxn];
 20
 21     void init()
 22     {
 23         for(int i=0;i<maxn;i++)
 24             G[i].clear();
 25         edge.clear();
 26         memset(d,0,sizeof(d));
 27         memset(vis,0,sizeof(vis));
 28         memset(cur,0,sizeof(cur));
 29     }
 30
 31     void addEdge (int from,int to,int cap)
 32     {
 33         edge.push_back((Edge){from,to,cap,0});
 34         edge.push_back((Edge){to,from,0,0});
 35         m = edge.size();
 36         G[from].push_back(m-2);
 37         G[to].push_back(m-1);
 38     }
 39
 40     bool BFS()
 41     {
 42         memset(vis,0,sizeof(vis));
 43         queue<int> Q;
 44         Q.push(s);
 45         d[s] = 0;
 46         vis[s] = 1;
 47         while(!Q.empty())
 48         {
 49             int x = Q.front();
 50             Q.pop();
 51             for(int i=0; i<G[x].size(); i++)
 52             {
 53                 Edge & e = edge[G[x][i]];
 54                 if(!vis[e.to]&&e.cap>e.flow)
 55                 {
 56                     vis[e.to] = 1;
 57                     d[e.to] = d[x] + 1;
 58                     Q.push(e.to);
 59                 }
 60             }
 61         }
 62         return vis[t];
 63     }
 64
 65     int DFS(int x,int a)
 66     {
 67         if(x==t||a==0) return a;
 68         int flow = 0,f;
 69         for(int & i = cur[x]; i<G[x].size(); i++)
 70         {
 71             Edge & e = edge[G[x][i]];
 72             if(d[x] + 1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0)
 73             {
 74                 e.flow +=f;
 75                 edge[G[x][i]^1].flow -=f;
 76                 flow +=f;
 77                 a-=f;
 78                 if(a==0) break;
 79             }
 80         }
 81         return flow;
 82     }
 83
 84     int Maxflow (int s,int t) {
 85         this->s = s;this->t = t;
 86         int flow = 0;
 87         while(BFS()) {
 88             memset(cur,0,sizeof(cur));
 89             flow+=DFS(s,INF);
 90         }
 91         return flow;
 92     }
 93
 94 }sol;
 95
 96
 97 int main()
 98 {
 99     int n,m;
100     scanf("%d%d",&n,&m);
101
102     int s = 0;
103     int t = 2*n+1;
104
105     sol.init();
106     int sum = 0;
107     for(int i=1;i<=n;i++) {
108         int a;
109         scanf("%d",&a);
110         sum +=a;
111         sol.addEdge(s,i,a);
112         sol.addEdge(i,i+n,INF);
113     }
114
115     int sum2 = 0;
116     for(int i=1;i<=n;i++) {
117         int a;
118         scanf("%d",&a);
119         sum2+=a;
120         sol.addEdge(i+n,t,a);
121     }
122
123     for(int i=0;i<m;i++) {
124         int u,v;
125         scanf("%d%d",&u,&v);
126         sol.addEdge(u,v+n,INF);
127         sol.addEdge(v,u+n,INF);
128     }
129
130     int ans = sol.Maxflow(s,t);
131     if(ans==sum&&sum2==sum)
132         puts("YES");
133     else puts("NO");
134
135     return 0;
136 }

时间: 2024-08-28 20:14:28

51nod 1442 士兵的旅行的相关文章

51nod 1441 士兵的数字游戏 (素数处理

1441 士兵的数字游戏 题目来源: CodeForces 基准时间限制:6 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 两个士兵正在玩一个游戏,游戏开始的时候,第一个士兵为第二个士兵选一个正整数n.然后第二个士兵要玩尽可能多的轮数.每一轮要选择一个正整数x>1,且n要是x的倍数,然后用n/x去代替n.当n变成1的时候,游戏就结束了,第二个士兵所得的分数就是他玩游戏的轮数. 为了使游戏更加有趣,第一个士兵用 a! / b! 来表示n.k!表示把所有1到k的数

【51Nod】遥远的旅行

Description 一个国家有 N 个城市, 这些城市被标为 0,1,2,...N-1. 这些城市间连有 M 条道路, 每条 道路连接两个不同的城市, 且道路都是双向的. 一个小鹿喜欢在城市间沿着道路自由的穿梭, 初始时小鹿在城市 0 处, 它最终的目的地是城市 N-1 处. 小鹿每在一个城市, 它会选择一条 道路, 并沿着这条路一直走到另一个城市, 然后再重复上述过程. 每条道路会花费小鹿不同 的时间走完, 在城市中小鹿不花时间逗留. 路程中, 小鹿可以经过一条路多次也可以经过一个城市多次

51nod 1442 最大流

点击打开链接 题意:中文了 思路:最大流求解,源点连城市流量ai,城市连汇点流量bi,下面的边是无向图,拆点后建有向的就可以了,最后判断满流 #include <queue> #include <vector> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using n

51nod 1273 旅行计划——思维题

某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去过的城市同样多,优先考虑编号最小的城市),直到所有城市都观光过一遍.现在给出城市之间的交通图T,以及出发地点K,你来设计一个旅行计划,满足上面的条件.例如: (K = 2) 第1天 从2到0 (城市 1 和 0 变成去过的) 第2

51NOD 2368 珂朵莉的旅行

>>这是原题传送门<< 答案参考来自 http://www.cnblogs.com/sugewud/p/9822933.html 思路:思维题OR规律题?个人没写出来,脑子里只有深度DFS暴力,看完了一个大佬的题解,学到了思路ANDpow()函数的另一种写法,妙不可言! 先说思路:从一条链的时候开始推导,假如这条链长度为n,这条链上面的点分为两种-端点和非端点: 先看非端点的情况 0-0-0-0-0-0-0-0-0-0-0 其中的某一个非端点,到达两个端点的情况是2^(n-2),也

2014年9月欧洲旅行攻略篇

签证篇 对于拿猪肝红P字头的中国居(屁)民来说,只要不是冒险家愿意去那几个免签国,是出国几乎就得搞签证,这个是无法避免的问题. 对于申根签证来说,由于存在一个从哪国入境的问题,一般是从哪国入境就得去哪国大使馆办理签证,而且第一个国家停留的时间要长一些.只要你的行程出现了多个国家,一般发给你的就是整个申根地区都可以用的签证了. 值得注意的是,不同国家申请的难度是不一样的.意大利希腊比较简单,不会怎么查你的日程安排酒店预定情况,毕竟需要用旅游刺激经济,欢迎外国游客:德国瑞士就不一样了,要求出示不能退

floyd算法--一个人的旅行

2017-07-27 22:37:32 writer:pprp 题目如下: 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历, 还可以看美丽的风景--草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信, 去北京探望孟姜女--眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训

51nod 1201 整数划分(dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题解:显然是一道dp,不妨设dp[i][j]表示数字i分成j个一共有几种分法. 那么转移方程式为: dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] 表示将i - 1划分为j个数,然后j个数都+1 还是不重复,将i - 1划分为j - 1个数,然后j - 1个数都+1,再加上1这个数. 然后就是j的范围要知道1+2+

[BZOJ2388]旅行规划

试题描述 OIVillage是一个风景秀美的乡村,为了更好的利用当地的旅游资源,吸引游客,推动经济发展,xkszltl决定修建了一条铁路将当地n个最著名的经典连接起来,让游客可以通过火车从铁路起点(1号景点)出发,依次游览每个景区.为了更好的评价这条铁路,xkszltl为每一个景区都哦赋予了一个美观度,而一条旅行路径的价值就是它所经过的景区的美观度之和.不过,随着天气与季节的变化,某些景点的美观度也会发生变化. xkszltl希望为每位旅客提供最佳的旅行指导,但是由于游客的时间有限,不一定能游览