题目地址:​​点击打开链接​

思路:模板题,考虑到商店和赛场有可能在一个路口,结果把dist[1]=0去掉还能AC,数据还没变态到这种程度,这类题应该还要判断重边的可能,否则大值有可能会覆盖小值,本题不用考虑,懒得改了,还有就是尽量把初始地和目的地放进变量里,方便以后套模板

思路2:和第一个不同的是全都跑完了

思路3:第一次参照别人写的SPFA代码,有时间改

AC代码:

#include <iostream>
#include <cstdio>

using namespace std;

int a[110][110],dist[110],visit[110];
int n,m;
const int maxn = 1000000;

void dijkstra()
{
int x,y,z;
int i,j,min1,k;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
a[i][j] = maxn;
}
}
for(i=1; i<=m; i++)
{
cin>>x>>y>>z;
a[x][y] = z;
a[y][x] = z;
}
for(i=1; i<=n; i++)
{
dist[i] = a[1][i];
visit[i] = 0;
}
dist[1] = 0;
visit[1] = 1;
for(i=1; i<n; i++)
{
min1 = maxn;
for(j=1; j<=n; j++)
{
if(visit[j] == 0 && dist[j] < min1)
{
k = j;
min1 = dist[j];
}
}
visit[k] = 1;
if(k == n)//搜到直接退出来就行
break;
for(j=1; j<=n; j++)
{
if(visit[j] == 0 && dist[k] + a[k][j] < dist[j])
dist[j] = dist[k] + a[k][j];
}
}
}

int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
if(n + m == 0)
break;
dijkstra();
printf("%d\n",dist[n]);
}
return 0;
}


AC代码2


#include <iostream>
#include <cstdio>

using namespace std;

int a[110][110],dist[110],visit[110];
int n,m;
const int maxn = 1000000;

void dijkstra()
{
int x,y,z;
int i,j,min1,k;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
a[i][j] = maxn;
}
}
for(i=1; i<=m; i++)
{
cin>>x>>y>>z;
a[x][y] = z;
a[y][x] = z;
}
for(i=1; i<=n; i++)
{
dist[i] = a[1][i];
visit[i] = 0;
}
dist[1] = 0;
visit[1] = 1;
for(i=1; i<n; i++)
{
min1 = maxn;
for(j=1; j<=n; j++)
{
if(visit[j] == 0 && dist[j] < min1)
{
k = j;
min1 = dist[j];
}
}
visit[k] = 1;
for(j=1; j<=n; j++)
{
if(visit[j] == 0 && dist[k] + a[k][j] < dist[j])
dist[j] = dist[k] + a[k][j];
}
}
}

int main()
{
while(scanf("%d%d",&n,&m) != EOF)
{
if(n + m == 0)
break;
dijkstra();
printf("%d\n",dist[n]);
}
return 0;
}


错误代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;
const int maxn = 110;
const int inf = 0x3f3f3f3f;

struct node
{
int to;
int value;
}tt;

int n,m;
vector<node> vec[maxn];
int dist[maxn];
int visit[maxn];

void spfa()
{
memset(dist,inf,sizeof(dist));
memset(visit,0,sizeof(visit));
dist[1] = 0;
visit[1] = 1;
queue<int> que;
que.push(1);
while(!que.empty())
{
int t = que.front();
que.pop();
visit[t] = 0;
int size = vec[t].size();
for(int i=0; i<size; i++)
{
int value = vec[t][i].value;
int s = vec[t][i].to;
if(dist[s] > dist[t] + value)
{
dist[s] = dist[t] + value;
if(visit[s] == 0)
{
visit[s] = 1;
que.push(s);
}
}
}
}
}

int main()
{
while(scanf("%d%d",&n,&m))
{
for(int i=1; i<=n; i++)
{
vec[i].clear();
}
if(n + m == 0)
break;
for(int i=0; i<m; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
tt.to = a;
tt.value = c;
vec[b].push_back(tt);
tt.to = b;
vec[a].push_back(tt);
}
spfa();
printf("%d\n",dist[1]);
}
}