ZOJ 3378 求割边+最短路
来源:互联网 发布:mac charles 编辑:程序博客网 时间:2024/06/04 19:38
题目大意:给你一个地图,A君要从0走到n-1,B君想要埋伏A君,问A的必经之路有哪些
题目思路:必经之路首先想到割边,但是割边不一定都是解,因为割边是去掉这条边后形成两个字图(应该是这样的吧。。),但是有可能不需要经过那部分,所以在求下最短路,这样就把不需要经过的去掉了。
注意:即使没有满足条件的边也要输出一个回车,不要问我怎么知道的
代码:
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<map>#include<queue>#include<set>using namespace std;const int maxn = 10010;const int maxm = 200200;const int inf = 0x3f3f3f3f;struct Side{ int v,next,id;}side[maxm];int top;int node[maxn];map<int,int>num[maxn];void add_side(int u,int v,int id){ side[top] = (Side){v,node[u],id}; node[u] = top ++;}int vis[maxn],low[maxn],dfn[maxn],cnt;set<int>ss;set<int>ans;void dfs(int u,int fa){ vis[u] = 1; dfn[u] = low[u] = cnt++; for(int i = node[u];i != -1;i = side[i].next){ int v = side[i].v; if(v != fa&&vis[v] == 1) low[u] = min(low[u],dfn[v]); if(vis[v] == 0){ dfs(v,u); low[u] = min(low[u],low[v]); if(low[v] > dfn[u]&&num[u][v] == 1){ ss.insert(side[i].id); } } }}int get_id(int u,int v){ for(int i = node[u];i != -1;i = side[i].next){ if(v == side[i].v){return side[i].id;} }}int fa[maxn];void spfa(int s,int t){ memset(vis,0,sizeof(vis)); memset(dfn,inf,sizeof(dfn)); queue<int>q; q.push(s); dfn[s] = 0; while(!q.empty()){ int now = q.front();q.pop(); vis[now] = 0; for(int i = node[now];i != -1;i = side[i].next){ int v = side[i].v; if(dfn[v] > dfn[now] + 1){ dfn[v] = dfn[now] + 1; fa[v] = now; if(vis[v] == 0){ q.push(v); vis[v] = 1; } } } } return ;}int main(){ int n,m; //freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&m)){ memset(node,-1,sizeof(node)); top = 0; for(int i = 0;i < maxn;i ++)num[i].clear(); ss.clear(); ans.clear(); for(int i = 0;i < m;i ++){ int a,b; scanf("%d%d",&a,&b); add_side(a,b,i); add_side(b,a,i); num[a][b] ++; num[b][a] ++; } memset(vis,0,sizeof(vis)); memset(low,0,sizeof(low)); memset(dfn,-1,sizeof(dfn)); memset(fa,-1,sizeof(fa)); cnt = 0; for(int i = 0;i < n;i ++){ if(dfn[i] == -1)dfs(i,-1); } spfa(0,n-1); int now = n-1; int tot = 0; while(1){ int f = fa[now]; if(f == -1)break; int id = get_id(f,now); if(ss.count(id)){ans.insert(id);tot++;} now = f; } printf("%d\n",tot); set<int>::iterator it; vector<int>pri; for(it = ans.begin();it != ans.end();it ++){ pri.push_back((*it)); } int siz = pri.size(); for(int i = 0;i < siz;i ++){ if(i == siz-1)printf("%d",pri[i]); else printf("%d ",pri[i]); } printf("\n"); } return 0;}
0 0
- ZOJ 3378 求割边+最短路
- ZOJ 2027 最短路
- ZOJ 2797 最短路
- ZOJ 1082 最短路
- ZOJ 1221 最短路
- ZOJ 1857 最短路
- ZOJ 3794 最短路
- zoj 1221 Risk 最短路
- ZOJ 2504 Help John! 【最短路】 【Dijkstra】
- ZOJ 1655 Transport Goods 【最短路】【Dijkstra】
- zoj 1082 Stockbroker Grapevine 最短路 Dijkstra
- zoj 1952 Heavy Cargo 最短路 Dijkstra
- zoj 1092 Arbitrage(最短路,floyd)
- zoj 1221 Risk 最短路 floyd
- zoj 3166 Lazy Tourist 最短路 floyd
- zoj 1298 Domino Effect(最短路)
- zoj 2750 Idiomatic Phrases Game(最短路)
- zoj 2027 Travelling Fee(最短路)
- gensim学习笔记之基本概念
- PHP一些画图方法
- Android framework系统默认设置修改
- ubuntu 上android 源码编译 全过程(二)
- 悟道诗欣赏
- ZOJ 3378 求割边+最短路
- 读取文件的特定的几行
- Eclipse 及中文包 下载,安装
- 在Win7 64 位系统下注册MSComm控件
- 对计算机bit的强大的理解力: 用10只小白鼠查找1000瓶药中有毒的那一瓶(只有一瓶)
- 代码
- 阿里云上部署webservice或者网站,服务器本身测试可以整成使用,但是在其他机器上调用时找不到网页或者webservice
- 谷歌科学家、Hinton亲传弟子Ilya Sutskever的深度学习综述及实际建议
- 2014 辽宁 ACM 省赛 ( kuangbin oj 1020)|| Distance(两点式直线公式或直线求交点