社区讨论
20分求助力
P1144最短路计数参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo2ub55m
- 此快照首次捕获于
- 2023/10/23 19:54 2 年前
- 此快照最后确认于
- 2023/10/23 19:54 2 年前
能过样例和第六个点
C#include<iostream>
#include<queue>
#include<cstring>
#define inf 0x3f3f3f3f
#define INF 0x7fffffff
using namespace std;
const int maxn = 1e6;
struct node
{
int v, next, w;
}edge[maxn];
int cnt;
bool vis[maxn];
int dis[maxn], head[maxn], ans[maxn];
void add(int u, int v, int w)//起点,终点,距离,链式前向星建图
{
edge[cnt].w = w;
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt;
cnt++;
}
void dijkstra(int n, int st)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>q;
memset(dis, inf, sizeof dis);
q.push({ 0,st });
dis[st] = 0;
ans[st] = 1;
while (!q.empty())
{
pair<int, int> temp = q.top();//记录堆顶,即堆内最小的边并将其弹出
q.pop();
int u = temp.second;//点
if (vis[u]) continue;//如果被访问过,就跳过
//只用访问一次,从这个点走的边已经全部更新了
vis[u] = true;//标记
for (int i = head[u]; i != -1; i = edge[i].next)//搜索堆顶的所有连边
{
int v = edge[i].v;
if (dis[v] > dis[u] + edge[i].w)//松弛操作
{
ans[v] = ans[u];
dis[v] = dis[u] + edge[i].w;
q.push({ dis[v],v });//把新遍历的点加到堆中
//把终点丢进堆里头
}
else if (dis[v] == dis[u] + edge[i].w) {
ans[v] += ans[u];
ans[v] %= 100003;
}
}
}
//if(dis[n]==inf) cout<<-1<<endl;
//else cout<<dis[n]<<endl;
for (int i = 1; i <= n; i++)
cout << ans[i] << endl;
}
int main()
{
int st;
int n, m, u, v, w;
cin >> n >> m ;
memset(head, -1, sizeof(head));
for (int i = 0; i < m; i++)
{
cin >> u >> v ;
add(u, v, 1);
}
dijkstra(n, 1);
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...