JZOJ 4246. 【五校联考6day2】san


题目:

传送门


题意:

求对于图上的每个节点被不和谐的最短路经过的次数


分析:

最短路我们可以用 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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值