Orientation of Edges CodeForces
来源:互联网 发布:农村淘宝服务站快递 编辑:程序博客网 时间:2024/05/17 02:46
n点,m边,一个点s,输入m条边,有单向边和双向边,决定双向边的方向使得和s相连的点最多/最少 题目链接
bfs做法:
#include<bits/stdc++.h>using namespace std;const int maxn = 5e5+7;struct node{ int u,v,id,next;}edge[2000000];int color[maxn];bool vis[maxn];int head[maxn],cnt;void addedge(int u,int v,int id){ edge[cnt].u = u; edge[cnt].v =v; edge[cnt].id= id; edge[cnt].next = head[u]; head[u] =cnt++;}int bfs1(int u){ queue<int>o; o.push(u); memset(vis,0,sizeof(vis)); int ans = 0; vis[u] = true; ans++; while(!o.empty()) { int u = o.front(); o.pop(); for(int i=head[u];~i;i = edge[i].next) { int v= edge[i].v; int id = edge[i].id; if(vis[v])continue; if(id!=-1) { color[id/2] = (id%2); //取出时按照0,1,2,3,。。的形式取出 //并对2取余判断双向边的方向 } o.push(v); vis[v] = true; ans++; } } return ans;}int bfs2(int u){ queue<int>o; o.push(u); memset(vis,0,sizeof(vis)); int ans = 0; ans++; vis[u] = true; while(!o.empty()) { int u = o.front(); o.pop(); for(int i=head[u];~i;i = edge[i].next) { int v= edge[i].v; int id = edge[i].id; if(vis[v])continue; if(id!=-1) { color[id/2] = 1^(id%2); continue; //求最小值时能联通的边一律取反,使其不联通 } o.push(v); vis[v] = true; ans++; } } return ans;}int main(){ int n,m,s; cnt = 0; memset(head,-1,sizeof(head)); int pos = 0; scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=m;i++) { int op,u,v; scanf("%d%d%d",&op,&u,&v); if(op==1) { addedge(u,v,-1); } else { addedge(u,v,pos); addedge(v,u,pos+1); pos+=2; } //存储时按0,1, 2,3...的形式存储 } int ans1 = bfs1(s); cout<<ans1<<endl; for(int i=0;i<pos/2;i++) { if(color[i])printf("-"); else printf("+"); } cout<<endl; int ans2 = bfs2(s); cout<<ans2<<endl; for(int i=0;i<pos/2;i++) { if(color[i])printf("-"); else printf("+"); } return 0;}
dfs做法:
#include<bits/stdc++.h>using namespace std;const int maxn = 5e5+7;typedef pair<int,int> pa;vector<pa>G[maxn];int sum;int vis[maxn],ans[maxn],op[maxn];int u[maxn],v[maxn];void dfs1(int u){ if(vis[u])return; vis[u] = 1; sum++; for(auto y: G[u]) { if(op[y.second]==1) dfs1(y.first); else if(!ans[y.second]) { if(v[y.second]==y.first)//双向边的正向 ans[y.second] =1; else ans[y.second] = 2; dfs1(y.first); } }}void dfs2(int u){ if(vis[u])return; vis[u] = 1; sum++; for(auto y: G[u]) { if(op[y.second]==1) dfs2(y.first); else if(!ans[y.second]) { if(v[y.second]==y.first)//双向边的正向 ans[y.second] =2; else ans[y.second] = 1; } }}int main(){ int n,m,s; scanf("%d%d%d",&n,&m,&s); for(int i=1; i<=m; i++) { scanf("%d%d%d",&op[i],&u[i],&v[i]); G[u[i]].push_back(make_pair(v[i],i)); if(op[i]==2) G[v[i]].push_back(make_pair(u[i],i)); } memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); sum = 0; dfs1(s); cout<<sum<<endl; for(int i=1; i<=m; i++) { if(op[i]==2) { if(ans[i]==1) printf("+"); else printf("-"); } } cout<<endl; memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); sum = 0; dfs2(s); cout<<sum<<endl; for(int i=1; i<=m; i++) { if(op[i]==2) { if(ans[i]==1) printf("+"); else printf("-"); } } cout<<endl; return 0;}
阅读全文
0 0
- Orientation of Edges CodeForces
- Codeforces 883G Orientation of Edges(BFS+MAP)
- G. Orientation of Edges dfs
- 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest G. Orientation of Edges
- Codeforces 160D Edges in MST
- [Codeforces]160D - Edges in MST
- codeforces 160D Edges in MST
- codeforces 160D - Edges in MST
- CodeForces 160D Edges in MST 题解
- CodeForces 160D Edges in MST (tarjan)
- orientation
- codeforces #576E Painting Edges 分治+并查集
- Fast Detection of Curved Edges at Low SNR
- The principles of service-orientation part 1 of 6: Introduction to service-orientation [by Thomas Erl]
- An example of using libexif to set JPEG Orientation Tag
- An example of using libexif to set JPEG Orientation Tag
- Basic Principles of Object Orientation(面向对象的基本概念)
- Closed-form Solution of Absolute Orientation Using Unit Quaternions
- 查找最近元素
- Linux命令——ls
- CS231n(10):最优化笔记(上)
- 各种分布的python例子
- C语言循环语句体会
- Orientation of Edges CodeForces
- Linux下部署LAMP环境(Linux+Apache+MySQL+PHP)
- C++ Primer Plus第二章的学习心得
- python---模块定义,模块导入方式,模块同目录调用、模块跨目录调用
- Linux重要文件介绍
- 路径解析_90
- Ralph And His Tour in Binary Country
- Tools相关3_一、什么是SVN
- Java工作经验总结(一),视频发布了~~~