数据结构-图
数据结构-图
洛谷 P5318
https://www.luogu.com.cn/problem/P5318
#include<bits/stdc++.h>
using namespace std;
struct edge{//存边结构体
int u,v;//开始结束点 u为开始 v为结束
};
vector <int> e[100001];
vector <edge> s;
bool vis1[100001]={0},vis2[100001]={0};//标记数组
bool cmp(edge e1,edge e2){//排序规则
if(e1.v==e2.v)
return e1.u<e2.u;
else return e1.v<e2.v;
}
void dfs(int x){//深度优先遍历
vis1[x]=1;
cout<<x<<" ";
for(int i=0;i<e[x].size();i++){
int point=s[e[x][i]].v;
if(!vis1[point]){
dfs(point);
}
}
}
void bfs(int x){ //广度优先遍历
queue <int> q;
q.push(x);
cout<<x<<" ";
vis2[x]=1;
while(!q.empty()){
int fro=q.front();
for(int i=0;i<e[fro].size();i++){
int point=s[e[fro][i]].v;
if(!vis2[point]){
q.push(point);
cout<<point<<" ";
vis2[point]=1;
}
}
q.pop();
}
}
int main(){
int n,m; //输入,存边
cin>>n>>m;
for(int i=0;i<m;i++){
int uu,vv;
cin>>uu>>vv;
s.push_back((edge){uu,vv});
}
sort(s.begin(),s.end(),cmp); //排序
for(int i=0;i<m;i++)
e[s[i].u].push_back(i);
dfs(1); //从1号顶点开始深搜
cout<<endl;
bfs(1); //广搜亦同理
}
洛谷 P1113
https://www.luogu.com.cn/problem/P1113
#include<bits/stdc++.h>
#define MAXN 10010
using namespace std;
int n,x,y,t,ans,len[MAXN],vis[MAXN];
vector<int> linker[MAXN];
int dfs(int x){
if(vis[x]) return vis[x];
for(int i=0;i<linker[x].size();i++){
vis[x]=max(vis[x],dfs(linker[x][i]));
}
vis[x] += len[x];
return vis[x];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x>>len[i];
while(cin>>y){
if(!y){
break;
}else{
linker[y].push_back(x);
}
}
}
for(int i=1;i<=n;i++){
ans = max(ans,dfs(i));
}
cout<<ans<<endl;
return 0;
}
洛谷 P4017
https://www.luogu.com.cn/problem/P4017
#include<bits/stdc++.h>
using namespace std;
#define MAXN 5005
#define MAXM 500005
#define MOD 80112002
int n,m,ans;
vector <int> p[MAXN];
queue <int> q;
int f[MAXN],ind[MAXN],outd[MAXN];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
outd[x]++;
ind[y]++;
p[x].push_back(y);
}
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++){
if(ind[i]==0){
q.push(i);
f[i]=1;
}
}
while(!q.empty()){
int x = q.front();
q.pop();
for(int i=0,sz=p[x].size();i<sz;i++){
int y=p[x][i];
f[y]=(f[x]+f[y])%MOD;
ind[y]--;
if(ind[y]==0){
q.push(y);
}
}
}
for(int i=1;i<=n;i++){
if(outd[i]==0){
ans=(ans+f[i])%MOD;
}
}
cout<<ans<<endl;
}
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号