题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1874
思路
n,m的范围不大直接用邻接矩阵存就行,可以训练各种最短路的做法(但可能我太菜了,我用堆优化的dijkstra直接TLE了,不知道为什么QAQ)。
Floyd代码
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=210;
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++)
{
if(d[i][j]>d[i][k]+d[k][j])
{
d[i][j]=d[i][k]+d[k][j];
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j) d[i][j]=0;
else
{
d[i][j]=INF;
}
}
}
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
getchar();
if(d[a][b]>c)
{
d[a][b]=d[b][a]=c;
}
}
int s,t;
scanf("%d%d",&s,&t);
getchar();
floyd();
if(d[s][t]==INF)
{
printf("-1\n");
}
else
{
printf("%d\n",d[s][t]);
}
}
return 0;
}
朴素Dijkstra代码
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=210;
int n,m;
int g[N][N];
int vis[N],dis[N];
void Dijkstra(int u){
memset(dis, 0x3f, sizeof(dis));
for(int i=0;i<n;i++){
dis[i]=g[u][i];//初始化指定起点到其它点的距离
}
dis[u] = 0;
vis[u] = 1;
for (int i = 0; i < n - 1; i ++ )
{
int t = -1; // 在还未确定最短路的点中,寻找距离最小的点
for (int j = 0; j < n; j ++ )
if (!vis[j] && (t == -1 || dis[t] > dis[j]))
t = j;
// 用t更新其他点的距离
for (int j = 0; j < n; j ++ )
dis[j] = min(dis[j], dis[t] + g[t][j]);
vis[t] = 1;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(g,INF,sizeof(g));
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
getchar();
if(g[a][b]>c)
{
g[a][b]=g[b][a]=c;
}
}
int s,t;
scanf("%d%d",&s,&t);
getchar();
Dijkstra(s);
if(dis[t]==INF)
printf("-1\n");
else
printf("%d\n",dis[t]);
}
return 0;
}
SPFA代码
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=210;
int n,m;
int g[N][N];
int vis[N],dis[N];
void SPFA(int u){
memset(dis, 0x3f, sizeof(dis));
dis[u] = 0;
vis[u] = 1;
queue<int> q;
q.push(u);
while(q.size())
{
auto t=q.front();
q.pop();
vis[t]=0;
for(int i=0;i<n;i++)
{
if(dis[i]>dis[t]+g[t][i])
{
dis[i]=dis[t]+g[t][i];
if(!vis[i])
{
vis[i]=1;
q.push(i);
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(g,INF,sizeof(g));
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
getchar();
if(g[a][b]>c)
{
g[a][b]=g[b][a]=c;
}
}
int s,t;
scanf("%d%d",&s,&t);
getchar();
SPFA(s);
if(dis[t]>=INF)
printf("-1\n");
else
printf("%d\n",dis[t]);
}
return 0;
}