FZU - 2271 X (Floyd)

原创 2018年04月17日 16:34:25

题意:给出n个点,m条边,在保持任意两点之间最短路径距离不变的情况下,最多可以去除多少边?

思路:在输入数据的时候,可以去除一些边,因为我们只需要两个点之间距离最小的那条边,然后跑一遍Floyd算法,求出任意两点的最短路,如果两个点是直接相连,并且被松弛过,或者松弛之后的距离与两点直接相连的距离相等,我们就可以去除这条两点之间直接相连的边。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<string>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<algorithm>
#define MAX 105
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;

int e[MAX][MAX];
int ee[MAX][MAX];
int cnt[MAX][MAX];
int is[MAX][MAX];

int main(void)
{
	int t,n,m,i,j,k;
	scanf("%d",&t);
	int cas = 0;
	
	while(t--){
		
		int n,m;
		scanf("%d%d",&n,&m);
		memset(cnt,0,sizeof(cnt));
		memset(is,0,sizeof(is));
		memset(ee,0,sizeof(ee));
		
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= n; j++){
				if(i == j){
				   e[i][j] = 0;
			    }
			else{
				   e[i][j] = INF;
			    }
			}
		}
		
		int ans = 0;
		for(int i = 1; i <= m; i++){
			int a,b,w;
			scanf("%d%d%d",&a,&b,&w);
			//保留最小的边的距离 
			e[a][b] = e[b][a] = min(e[a][b],w);
			//记录两点之间边的数量 
			cnt[a][b]++;
			cnt[b][a]++;
			//记录两点之间是否有边相连 
			ee[a][b] = ee[b][a] = 1;
		}
		
		for(int i = 1; i <= n; i++){
			for(int j = i + 1; j <= n; j++){
				if(cnt[i][j] > 0){
					//两点之间我们只需要那条最短边,其余的都舍去 
					ans += cnt[i][j] - 1;
				}
			}
		}

		
		for(int k = 1; k <= n; k++){
			for(int i = 1; i <= n; i++){
				for(int j = 1; j <= n; j++){

					if(i == k){
						continue;
					}
					if(j == k){
						continue;
					}
					//标记被松弛的以及松弛之后距离与原来相等的 
					if(e[i][j] >= e[i][k] + e[k][j]){
						e[i][j] = e[i][k] + e[k][j];
						is[i][j] = is[j][i] = 1;
					}
				}
			}
		}
		
		for(int i = 1; i <= n; i++){
			for(int j = i + 1; j <= n; j++){
				if(is[i][j] && ee[i][j]){
					ans++;
				}
			}
		}
		printf("Case %d: %d\n",++cas,ans);
	
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GYH0730/article/details/79976642

ASP.NET 在线考试系统 X宝3000元定制c#毕业设计讲解

本课程主要针对某ASP.NET在线考试系统进行视频讲解。该系统定做价格为3000元 ASP.NET 在线考试系统 增强版 自带听力题(可播放MP3)。 该课程是在某在线考核系统的基础上,根据导师要求,增加四六级英语考试中的听力部分,功能包括1、院系管理2、专业管理3、班级管理4、考试科目管理5教师管理6学生管理7听力题管理8选择题9问答题10阅读题管理 共管理员、教师、学生三个不同角色
  • 2017年09月15日 00:24

fzu2271 X

该补的题解:https://zxy160.github.io/
  • zxy160
  • zxy160
  • 2017-07-19 18:45:39
  • 82

FZU 2271 X Floyd

题目链接http://acm.fzu.edu.cn/problem.php?pid=2271题意给定一有重边的无向图,定义两点间的距离为它们的最短路距离,问最多可以删除几条边使图中点间距离不变。思路首...
  • chen_minghui
  • chen_minghui
  • 2017-10-03 22:15:19
  • 69

Problem 2271 X (flyod变形)

Problem 2271 X Accept: 113 Submit: 385 Time Limit: 1500 mSec Memory Limit : 32768 KB Proble...
  • zezzezzez
  • zezzezzez
  • 2017-07-20 11:07:25
  • 169

FZU2271 X(最短路,Folyd变形)(第七届福建省大学生程序设计竞赛)

题目:  Problem 2271 X Accept: 28    Submit: 115 Time Limit: 1500 mSec    Memory Limit : 32768...
  • riba2534
  • riba2534
  • 2017-07-18 21:36:14
  • 449

FZU Problem 2271 X(最短路)

Problem DescriptionX is a fully prosperous country, especially known for its complicated transportat...
  • qq_33183401
  • qq_33183401
  • 2017-07-19 10:33:13
  • 254

FZU Problem 2271 X(Floyd)

X is a fully prosperous country, especially known for its complicated transportation networks. But r...
  • lpeaceminusone
  • lpeaceminusone
  • 2017-07-22 11:52:42
  • 82

FZU 2271 X(Floyd)

Problem 2271 X Accept: 166    Submit: 584 Time Limit: 1500 mSec    Memory Limit : 32768 KB ...
  • weixin_38327682
  • weixin_38327682
  • 2017-08-04 14:13:49
  • 94

Fzu 2271 X【Floyd】

Problem 2271 X Accept: 19    Submit: 80 Time Limit: 1500 mSec    Memory Limit : 32768 KB  P...
  • mengxiang000000
  • mengxiang000000
  • 2017-07-18 19:10:04
  • 227

X FZU - 2271(floyd)

X ...
  • codeswarrior
  • codeswarrior
  • 2018-04-18 16:27:25
  • 10
收藏助手
不良信息举报
您举报文章:FZU - 2271 X (Floyd)
举报原因:
原因补充:

(最多只允许输入30个字)