AtCoder Beginner Contest 051(ABCD)

AtCoder Beginner Contest 051(ABCD)

A - Haiku

思路:直接模拟。

B - Sum of Three Integers

思路:暴力枚举。

C - Back and Forth

思路:按矩阵走一个来回后再围一层矩阵走即可。

D - Candidates of No Shortest Paths

思路:多源最短路判断路径,用 s p f a spfa spfa记录存在的路径然后用 m m m减即可,标答的 f l o y d floyd floyd对条边进行匹配也可。

#include
using namespace std;
typedef long long ll;
const int N=105+5,M=2e3+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first
#define se second
#define pb push_back
#define il inline
int jg[N][N],vis[N],cnt,pre[N],h[N],d[N];
struct edge{
	int  to,nt,w;
}e[M];
void add(int u,int v,int w){
	e[++cnt]={v,h[u],w},h[u]=cnt;
	e[++cnt]={u,h[v],w},h[v]=cnt;
}
void spfa(int st){
	queue<int>q;
	mst(vis,0);
	mst(pre,-1);
	mst(d,0x3f);
	q.push(st);vis[st]=1,d[st]=0;
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=0;
		for(int i=h[u];i;i=e[i].nt){
			int v=e[i].to,w=e[i].w;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				pre[v]=u;
				if(!vis[v]) vis[v]=1,q.push(v);
			}
		}
	}
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	for(int i=1;i<n;i++){
		spfa(i);
		for(int j=i+1;j<=n;j++){
			int u=j;
			while(u!=i){
				jg[u][pre[u]]=jg[pre[u]][u]=1;
				u=pre[u];
			}
		}
	}
	int ans=m;
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++){
			if(jg[i][j]||jg[j][i]) ans--;
		}
	printf("%d\n",ans);
	return 0;
}

你可能感兴趣的:(Atcoder题解)