ABC 051D Candidates of No Shortest Paths 最短路(Floyd)

点击打开链接

题意:n个点m条边,求不在任意两点最短路径上的边个数 n<=100 
边(i,j) 在(s->t)的最短路径上的充要条件为 dist[s][i]+w[i][j]+dist[j][t]=dist[s][t]; 等式1 
暴力枚举:边和s,t复杂度为O(m*n*n)
因为此时 边(i,j)在s->t上 所以顶点j为s->t的中间结点 dist[s][t]=dist[s][j]+dist[j][t] 等式2 
等式联立 得充要条件为:dist[s][i]+w[i][j]=dist[s][j] 
所以枚举:边和s即可,复杂度为O(m*n)

#include 
using namespace std;
const int N=2e2+20;
const int inf=1e9;
int dist[N][N];//dist[u][v] u->v shortest path
struct edge{
	int a,b,c;
}e[1100];
int n,m;
void Floyd()
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);		
			}
		}
	}
}
int main()
{
	while(cin>>n>>m)
	{
		for(int i=1;i<=n;i++)
		{	
			for(int j=1;j<=n;j++)
			{
				if(i==j)
				dist[i][j]=0;
				else
				dist[i][j]=inf;
			}
		}
		for(int i=0;i>e[i].a>>e[i].b>>e[i].c;	
			dist[e[i].a][e[i].b]=e[i].c;//无中间结点 
			dist[e[i].b][e[i].a]=e[i].c;
		}
		Floyd();
	
		int ans=m;   
		for(int i=0;i



你可能感兴趣的:(Graph,Theory,Graph,Theory,-,最短路)