题解
- 我们可以枚举起点跑spfa,然后对于每次跑出来的最短路径,用dfs来统计不和谐的路径数就好了
代码
1 #include <cstdio>
2 #include <iostream>
3 #include <queue>
4 #include <cstring>
5 #define N 2010
6 using namespace std;
7 struct edge{int v,to,from;}e[N*10];
8 int n,m,cnt,ans[N],p[N],dis[N],head[N];
9 bool bz[N];
10 queue<int>Q;
11 void insert(int x,int y,int v)
12 {
13 e[++cnt].to=y,e[cnt].from=head[x],e[cnt].v=v,head[x]=cnt;
14 e[++cnt].to=x,e[cnt].from=head[y],e[cnt].v=v,head[y]=cnt;
15 }
16 void dfs(int x,int fa)
17 {
18 p[x]=dis[x]%2;
19 for (int i=head[x];i;i=e[i].from)
20 if (dis[x]+e[i].v==dis[e[i].to])
21 dfs(e[i].to,x),p[x]+=p[e[i].to];
22 ans[x]+=p[x];
23 }
24 void spfa(int x)
25 {
26 memset(dis,127,sizeof(dis));
27 while (!Q.empty()) Q.pop(); dis[x]=0,Q.push(x);
28 while (!Q.empty())
29 {
30 int u=Q.front(); Q.pop();
31 for (int i=head[u];i;i=e[i].from)
32 if (dis[e[i].to]>dis[u]+e[i].v)
33 {
34 dis[e[i].to]=dis[u]+e[i].v;
35 if (!bz[e[i].to]) Q.push(e[i].to),bz[e[i].to]=1;
36 }
37 bz[u]=0;
38 }
39 dfs(x,0);
40 }
41 int main()
42 {
43 scanf("%d%d",&n,&m);
44 for (int i=1,x,y,v;i<=m;i++) scanf("%d%d%d",&x,&y,&v),insert(x,y,v);
45 for (int i=1;i<=n;i++) spfa(i);
46 for (int i=1;i<=n;i++) printf("%d
",ans[i]);
47 }