intspfa(){ queue<int> q;// 队列优化 for (int i = 1;i <= n;i ++){ q.push(i); //s[i] = true; } while (q.size()){ int t = q.front(); q.pop(); //s[t] = false; //从队列中取出来之后该节点st被标记为false,代表之后该节点如果发生更新可再次入队 for (int i = h[t]; ~i;i = ne[i]){// 拓展队头t的所有后继节点 int j = e[i]; if (d[j] > d[t] + w[i]){ d[j] = d[t] + w[i];// 边松弛 cnt[j] = cnt[t] + 1; if (cnt[j] >= n) returntrue; q.push(j);// j的距离发生更新,加入队列 } } } returnfalse; }
intmain(){ IOS; memset(h, -1, sizeof h); cin >> n >> m; for (int i = 0;i < m;i ++){ int a,b,c; cin >> a >> b >> c; add(a, b, c); } int t = spfa();// 题目限制边权绝对值不超过10000 if (t) cout << "Yes\n"; elsecout << "No\n"; return0; }
#include<iostream> #include<cstring> #include<algorithm> usingnamespacestd; #define IOS \ ios::sync_with_stdio(false); \ cin.tie(0); \ cout.tie(0) constint N = 210,INF = 0x3f3f3f3f; int d[N][N];// 邻接矩阵 int n,m,k;
voidfloyd(){ for (int k = 1;k <= n;k ++)// k必须放第一重循环 for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= n; j ++ ) d[i][j] = min(d[i][j],d[i][k] + d[k][j]); }
intmain(){ IOS; cin >> n >> m >> k; memset(d, 0x3f, sizeof d);// 邻接矩阵初始化为INF for (int i = 1; i <= n; i ++ ) d[i][i] = 0;// 消除自环 while (m -- ){ int x,y,z; cin >> x >> y >> z; d[x][y] = min(d[x][y],z);// 重边取权值最小的 } floyd(); while (k -- ){ int x,y; cin >> x >> y; int t = d[x][y]; if (t > INF/2) cout << "impossible\n"; elsecout << t << '\n'; } return0; }