spfa
59percent
·
·
个人记录
void spfa(int v0) {
memset(d, 0x3f, sizeof(d));
memset(vis, false, sizeof(vis));
d[v0] = 0;
vis[v0] = true;
q.push(v0);
while(!q.empty()) {
int x = q.front();
q.pop();
vis[x] = false;
for(int i=0; i<g[x].size(); i++) {
int y=g[x][i].y, w=g[x][i].w;
if(d[x]+w < d[y]) {
d[y] = d[x]+w;
if(vis[y]) continue;
vis[y] = true;
q.push(y);
}
}
}
}
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct Edge {
int y,w;
};
const int inf = 0x3f3f3f3f;
const int N=1005;
int n,m,s, d[N], cnt[N];
vector<Edge> g[N];
bool vis[N];
queue<int> q;
bool spfa(int v0) {
memset(d, 0x3f, sizeof(d));
memset(vis, false, sizeof(vis));//是否已入队,和bfs一样
d[v0] = 0;
vis[v0] = true;
q.push(v0);
while(!q.empty()) {
//1. 出队
int x = q.front();
q.pop();
//2. 可重复入队
vis[x] = false;
//3. 松弛后面的
for(int i=0; i<g[x].size(); i++) {
int y=g[x][i].y, w=g[x][i].w;
if(d[x]+w < d[y]) {
d[y] = d[x]+w;
if(vis[y]) continue;
vis[y] = true;
q.push(y);
}
}
}
return true;
}
int main() {
cin>>n>>m>>s;
for(int i=1; i<=m; i++) {
int x,y,w;
cin>>x>>y>>w;
Edge e = (Edge){y, w};
g[x].push_back(e);
}
bool flag = spfa(s);
if(!flag) {
cout<<"有负环"<<endl;
return 0;
}
for(int i=1; i<=n; i++)
cout<<(d[i]==inf?-1:d[i])<<" ";
return 0;
}
#include <iostream>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=20;
int n, m, k;
int d[N][N];//邻接矩阵
int main() {
cin>>n>>m>>k;
//1. 初始化
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
d[i][j] = i==j? 0: inf;
//2、输入\更新
for(int i=1; i<=m; i++) {
int x, y, w;
cin>>x>>y>>w;
d[x][y] = d[y][x] = w;
}
//3. 持续松弛:经过点k的路径,有前面的点i,有后面的点j
for(int k=1; k<=n; k++)//k在前面
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(d[i][k]+d[k][j] < d[i][j])
d[i][j] = d[i][k]+d[k][j];
for(int i=1; i<=k; i++) {
int x, y;
cin>>x>>y;
cout<<d[x][y]<<endl;
}
return 0;
}
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct Edge {
int y,w;
};
const int inf = 0x3f3f3f3f;
const int N=100005;
int n,m,s, d[N], cnt[N];
vector<Edge> g[N];
bool vis[N];
queue<int> q;
bool spfa(int v0) {
memset(d, 0x3f, sizeof(d));
memset(vis, false, sizeof(vis));
d[v0] = 0;
vis[v0] = true;
cnt[v0] = 1;
q.push(v0);
while(!q.empty()) {
int x = q.front();
q.pop();
vis[x] = false;
for(int i=0; i<g[x].size(); i++) {
int y=g[x][i].y, w=g[x][i].w;
if(d[x]+w < d[y]) {
d[y] = d[x]+w;
cnt[y] = cnt[x] + 1;
if(cnt[y]>n) {
return false;
}
if(vis[y]) continue;
vis[y] = true;
q.push(y);
}
}
}
return true;
}
int main() {
cin>>n>>m>>s;
for(int i=1; i<=m; i++) {
int x,y,w;
cin>>x>>y>>w;
Edge e = {y, w};
g[x].push_back(e);
}
bool flag = spfa(s);
if(!flag) {
cout<<"有负环"<<endl;
return 0;
}
for(int i=1; i<=n; i++)
cout<<(d[i]==inf?2147483647:d[i])<<" ";
return 0;
}