题目:
题意:
求对于图上的每个节点被不和谐的最短路经过的次数
分析:
最短路我们可以用
n
n
n遍
s
p
f
a
spfa
spfa来快速求解
而对于每个的答案,则用
d
f
s
dfs
dfs来进行统计
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<list>
#include<ctime>
#include<iomanip>
#include<string>
#include<bitset>
#include<deque>
#include<set>
#define LL long long
using namespace std;
inline LL read(){
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
struct node{int y,w,next;} a[6005];
int n,m,ls[6005],tot,d[1005][1005],ans[1005],s;
deque<int>q;
bool tf[1005];
void add(int x,int y,int w)
{
a[tot]=(node){y,w,ls[x]};
ls[x]=tot++;
}
int dfs(int x)
{
int sum=d[s][x]&1; ans[x]+=sum;
for (int i=ls[x];~i;i=a[i].next)
{
int v=a[i].y,z;
if (d[s][x]+a[i].w==d[s][v])
{
sum+=(z=dfs(v));
ans[x]+=z;
}
}
return sum;
}
void spfa(int root)
{
memset(tf,0,sizeof(tf));
q.push_back(root);
d[root][root]=0;
tf[root]=1;
while(q.size())
{
int x=q.front();
q.pop_front();
for(int i=ls[x];~i;i=a[i].next)
{
int v=a[i].y;
if(a[i].w+d[root][x]<d[root][v])
{
d[root][v]=a[i].w+d[root][x];
if(!tf[v]) q.push_back(v),tf[v]=1;
}
}
tf[x]=0;
}
return;
}
int main()
{
memset(d,0x3f3f3f3f,sizeof(d));
memset(ls,-1,sizeof(ls));
n=read();m=read();
int x,y,z;
for(int i=1;i<=m;i++) x=read(),y=read(),z=read(),add(x,y,z),add(y,x,z);
for(int i=1;i<=n;i++) spfa(i);
for(s=1;s<=n;s++) dfs(s);
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}