bellman_fold
#include<bits/stdc++.h>
using namespace std;
int n, m, e[10001], s[10001], w[10001],dis[10001],flag=0;
#define inf 100000000
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
dis[i] = inf;
dis[1] = 0;
for (int i = 1; i <= m; i++)
cin >> s[i] >> e[i] >> w[i];
for (int i = 1; i <= n - 1; i++)
{
for (int j = 1; j <= m; j++)
dis[e[j]] = min(dis[e[j]], dis[s[j]] + w[j]);
}
for (int i = 1; i <= m; i++)
{
if (dis[e[i]] > dis[s[i]] + w[i])
{
flag++;
break;
}
}
if (flag) cout << "负环路" << endl;
else
{
for (int i = 1; i <= n; i++)
cout << dis[i] << " ";
cout << endl;
}
return 0;
}
注意有负环路时,最小值可以无穷小,要专门思考这种情况。
#include<bits/stdc++.h>
using namespace std;
int vis[1001][1001], MAP[1001][1001];
int dx[4] = { 0,0,1,-1 }, dy[4] = { 1,-1,0,0 };
int startx, starty, endx, endy,flag=0,n,m;
struct node
{
int x, y, step;
};
void BFS(int x,int y)
{
queue<node>p;
node p0;
int cnt = 0;
p0.x = x, p0.y = y, p0.step = 0;
p.push(p0);
while (!p.empty())
{
node now;
now = p.front();
for (int i = 0; i < 4; i++)
{
node next;
next.x= now.x + dx[i];
next.y = now.y + dy[i];
next.step = now.step + 1;
if (next.x >= 1 && next.x <= n && next.y >= 1 && next.y <= m && MAP[next.x][next.y] != 3 && vis[next.x][next.y] != 1)
{
if (next.x == endx && next.y == endy)
{
cout << next.step << endl;
flag++;
return;
}
vis[next.x][next.y] = 1;
p.push(next);
}
}
p.pop();
}
cout << cnt << endl;
}
int main()
{
cin >> n >> m;
//1为起点,2为终点,3为障碍,其他数字皆表示该格可以走
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> MAP[i][j];
if (MAP[i][j] == 1)
{
startx = i;
starty = j;
}
if (MAP[i][j] == 2)
{
endx = i;
endy = j;
}
}
}
BFS(startx, starty);
if (!flag) cout << "no way" << endl;
return 0;
}
麻了,今晚还要补大物作业,spfa有时间就今天补上。