HDU 1874 Express Engineering 최단 회로 알고리즘 검사 문제
제목: 결점을 주고 무방향변을 주며 기점 a종점 b를 주고 가장 짧은 거리를 구한다.
사고방식: SPFA(또는 다른 모든 최단로 알고리즘)를 직접 설계한다.모든 최단 회로 알고리즘 코드의 검증 문제로 사용할 수 있다.
코드:
dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=210;
const int inf=0x3f3f3f3f;
int m,n,E[maxn][maxn];
int d[maxn],p[maxn];
void Dijkstra(int s)
{
bool vis[maxn];
fill(vis,vis+maxn,false);
fill(d,d+maxn,inf);
fill(p,p+maxn,inf);
d[s]=0;
while(1)
{
int u=-1;
for(int i=1;i<=n;i++)
{
if(!vis[i] && (u==-1 || d[i]<d[u])) u=i;
}
if(u==-1 || d[u]==inf) break;
vis[u]=true;
for(int v=1;v<=n;v++)
{
if(!vis[v] && d[u]+E[u][v]<d[v])
{
d[v]=d[u]+E[u][v];
p[v]=u;
}
}
}
}
int main()
{
int a,b,dis;
while(~scanf("%d%d",&n,&m))
{
fill(E[0],E[0]+maxn*maxn,inf);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&dis);
a++,b++;
if(E[a][b]>dis) E[a][b]=E[b][a]=dis;
}
int s,t;
scanf("%d%d",&s,&t);
s++,t++;
Dijkstra(s);
if(d[t]==inf) printf("-1
");
else printf("%d
",d[t]);
}
return 0;
}
Bellman-Ford
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXV=210;
const int MAXE=1100;
const int inf=0x3f3f3f3f;
int n,m,E[MAXV][MAXV];
int d[MAXV];
bool Bellman_Ford(int s)
{
memset(d,inf,sizeof(d));
d[s]=0;
for(int i=0;i<n-1;i++)
{
for(int u=0;u<n;u++)
{
for(int v=0;v<n;v++)
{
if(E[u][v]!=inf)
{
if(d[v]>E[u][v]+d[u])
{
d[v]=E[u][v]+d[u];
}
}
}
}
}
for(int u=0;u<n;u++)
{
for(int v=0;v<n;v++)
{
if(d[v]>E[u][v]+d[u]) return false;
}
}
return true;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(E,inf,sizeof(E));
int a,b,c;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(E[a][b]>c) E[a][b]=E[b][a]=c;
}
int s,t;
scanf("%d%d",&s,&t);
bool flag=Bellman_Ford(s);
if(flag==false || d[t]==inf) printf("-1
");
else printf("%d
",d[t]);
}
return 0;
}
Floyd
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
const int N=210;
const int inf=0x3f3f3f3f;
int n,m;
int d[N][N];
void Floyd()
{
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(d,inf,sizeof(d));
for(int i=0;i<n;i++) d[i][i]=0;
int a,b,c;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(d[a][b]>c) d[a][b]=d[b][a]=c;
}
Floyd();
scanf("%d%d",&a,&b);
if(d[a][b]==inf) printf("-1
");
else printf("%d
",d[a][b]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.