fzu 2210 攻占计划 图论 dfs
2015-11-24 19:07
323 查看
题目
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2210题目来源:fzu月赛
简要题意:中文不表。
数据范围:n⩽1000;m⩽10000n\leqslant 1000;\quad m\leqslant 10000
题解
粮仓就是入度为00的点。开始的时候sb了,没啥想法,之后看人代码然后枚举了粮仓就过了。
做题解的时候发现有点问题,实际上应该要去枚举所有的城市然后搜的。
基本做法就是枚举然后每次dfs,记录访问。
错误但可以AC的代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <queue> #include <string> #include <vector> #include <set> #include <map> #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define fi first #define se second using namespace std; typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; LL powmod(LL a,LL b, LL MOD) {LL res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;} // head const int N = 1005; const int M = 2E4+5; struct Edge { int to, nxt; Edge(int to, int nxt) : to(to), nxt(nxt){} Edge() {} }; int head ; int deg ; Edge e[M]; bool vis ; void addEdge(int from, int to, int cnt) { e[cnt] = Edge(to, head[from]); head[from] = cnt; } void init(int n) { for (int i = 0; i < n; i++) head[i] = -1, deg[i] = 0; } void dfs(int cur) { vis[cur] = true; for (int i = head[cur]; ~i; i = e[i].nxt) { if (!vis[e[i].to]) { dfs(e[i].to); } } } int main() { int n, m, u, v; while (scanf("%d%d", &n, &m) == 2) { init(n); int cnt = 0; for (int i = 0; i < m; i++) { scanf("%d%d", &u, &v); u--, v--; addEdge(u, v, cnt++); deg[v]++; } vector<int> vec; for (int i = 0; i < n; i++) { if (deg[i] == 0) vec.pb(i); } int ans = -1, no = -1; for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec.size(); j++) { if (i != j && !vis[vec[j]]) dfs(vec[j]); } int temp = 0; for (int j = 0; j < n; j++) { if (!vis[j]) temp++; } if (temp > ans) ans = temp, no = vec[i]; memset(vis, 0, sizeof vis); } printf("%d\n", no+1); } return 0; }
正确代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <stack> #include <queue> #include <string> #include <vector> #include <set> #include <map> #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define fi first #define se second using namespace std; typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; LL powmod(LL a,LL b, LL MOD) {LL res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;} // head const int N = 1005; const int M = 2E4+5; struct Edge { int to, nxt; Edge(int to, int nxt) : to(to), nxt(nxt){} Edge() {} }; int head ; int deg ; Edge e[M]; bool vis ; void addEdge(int from, int to, int cnt) { e[cnt] = Edge(to, head[from]); head[from] = cnt; } void init(int n) { for (int i = 0; i < n; i++) head[i] = -1, deg[i] = 0; } void dfs(int cur) { vis[cur] = true; for (int i = head[cur]; ~i; i = e[i].nxt) { if (!vis[e[i].to]) { dfs(e[i].to); } } } int main() { int n, m, u, v; while (scanf("%d%d", &n, &m) == 2) { init(n); int cnt = 0; for (int i = 0; i < m; i++) { scanf("%d%d", &u, &v); u--, v--; addEdge(u, v, cnt++); deg[v]++; } vector<int> vec; for (int i = 0; i < n; i++) { if (deg[i] == 0) vec.pb(i); } int ans = -1, no = -1; for (int i = 0; i < n; i++) { vis[i] = true; for (int j = 0; j < vec.size(); j++) { if (i != vec[j] && !vis[vec[j]]) dfs(vec[j]); } vis[i] = false; int temp = 0; for (int j = 0; j < n; j++) { if (!vis[j]) temp++; } if (temp > ans) ans = temp, no = i; memset(vis, 0, sizeof vis); } printf("%d\n", no+1); } return 0; }
相关文章推荐
- HDU 5570(balls-期望)
- 堆和栈的区别
- leetcode 70:Climbing Stairs
- MySQL复制表结构,表数据。
- Java char[]转String的两种方式
- Python一般错误
- Linux服务器下搭建(jdk+mysql+tomcat+cmake+redis)
- hive Illegal Operation state transition from CLOSED to ERROR的处理
- 指针内存分配
- NYOJ 642-牛奶
- C++静态分析工具
- 适配器模式Adapter(结构型)
- git操作---时光机穿梭
- 由于有中文命名的文件导致无法生成差分包
- PHP上传遇到的问题-php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项
- 基于A20处理器的RGB接口的LCD显示屏的移植
- Hadoop目录
- zoj3258 DP 01背包
- Leveldb源码分析--7
- 形象解释PID算法+PID算法源代码