明天比赛了,让我这个临时抱佛脚的选手写个图论题,练练手。
1.Dijkstra
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2100;
const int INF = 0x3f3f3f3f;
vector<PII> V[MAX];
int dis[MAX];
bool vis[MAX];
int gcd(int a,int b)
{
while(b)
{
int t=a%b;
a=b;
b=t;
}
return a;
}
void dijkstra(int s)
{
memset(dis,INF,sizeof dis);
priority_queue<PII,vector<PII>,greater<PII>> q; //按照距离的小顶堆
dis[s]=0;
q.push({0,s});
while(q.size())
{
PII t=q.top();
q.pop();
for(auto i:V[t.y]) //t.y为节点,t.x为距离
{
if(dis[i.x]>dis[t.y]+i.y)
{
dis[i.x]=dis[t.y]+i.y;
q.push({dis[i.x],i.x});
}
}
}
cout<<dis[2021];
}
int main()
{
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
if(abs(j-i)<=21)
{
int t=gcd(i,j);
V[i].push_back({j,i*j/t});
V[j].push_back({i,i*j/t});
}
}
}
dijkstra(1);
}
2.SPFA
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2100;
const int INF = 0x3f3f3f3f;
vector<PII> V[MAX];
int dis[MAX];
bool vis[MAX];
int gcd(int a,int b)
{
while(b)
{
int t=a%b;
a=b;
b=t;
}
return a;
}
void spfa(int s)
{
memset(dis,INF,sizeof dis);
queue<int> q;
q.push(s);
vis[s]=true;
dis[s]=0;
while(q.size())
{
int t=q.front();
q.pop();
vis[t]=false;
for(auto i:V[t]) //i.x为节点,i.y为路径
{
if(dis[i.x]>dis[t]+i.y)
{
dis[i.x]=dis[t]+i.y;
if(!vis[i.x])
{
vis[i.x]=true;
q.push(i.x);
}
}
}
}
cout<<dis[2021];
}
int main()
{
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
if(abs(j-i)<=21)
{
int t=gcd(i,j);
V[i].push_back({j,i*j/t});
V[j].push_back({i,i*j/t});
}
}
}
spfa(1);
}