P5318 【深基18.例3】查找文献
思路
大概就是给一张有向图,把它深度遍历一遍再广度遍历一遍
代码
#include<bits/stdc++,h>
using namespace std;
struct edge{
int u,v;
};
vector <int> e[100001];
vector <edge> s;
bool vis1[100001]={0},vis2[100001]={0};
bool cmp(edge x,edge y){
if(x.v==y.v)
return x.u<y.u;
else return x.v<y.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);
cout<<endl;
bfs(1);
}
U80592 【模板】floyd
思路
直接上floyd模板,三重循环
代码
#include<bits/stdc++.h>
using namespace std;
const int mod=998244354;
int n,m,f[505][505],a[505][505];
int main(){
cin>>n>>m;
memset(a,0x3f,sizeof(a));
for (int i=1; i<=n; i++) a[i][i]=0;
for (int i=1; i<=m; i++)
{
int u,v,w;
cin>>u>>v>>w;
a[u][v]=min(w,a[u][v]);
a[v][u]=min(w,a[v][u]);
}
for (int k=1; k<=n; k++)
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
int sum=0;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
sum=(sum+a[i][j])%mod;
}
cout<<sum<<endl;
sum=0;
}
return 0;
}
P4779 【模板】单源最短路径(标准版)
思路
暂时只写到40分呐,先把40分的代码贴出来吧,前三个样例tle了WWW
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#define N 200001
using namespace std;
struct kind{
int to;
int w;
}e;
vector <kind> map[N];
queue <int> q;
int visit[N],cnt[N],n,m,s;
long long cost[N];
void spfa()
{
memset(visit,0,sizeof(visit));
q.push(s);
visit[s]=1;
cost[s]=0;
while (!q.empty())
{
int t=q.front(); visit[t]=1;
for (int i=0;i<map[t].size();i++)
{
int to=map[t][i].to;
if (cost[to]>cost[t]+map[t][i].w)
{
cost[to]=cost[t]+map[t][i].w;
if (!visit[to])
{
q.push(to);
visit[to]=1;
}
}
}
visit[t]=0;
q.pop();
}
}
int main()
{
cin>>n>>m>>s;
for (int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
e.to=b; e.w=c;
map[a].push_back(e);
cost[i]=2147483647;
}
spfa();
for (int i=1;i<=n;i++) cout<<cost[i]<<" ";
return 0;
}