华师有N幢教学楼,每幢教学楼之间有多条线路连接,由于维护每条路都需要花费不菲的金额。机智的华师男想要为学校省钱,关闭几条线路,但是又不想增加自己从一个教学楼去另一个教学楼的路程。
请问最多可以关闭多少路,使得任何两幢教学楼之间的路程不会被改变。请注意,教学楼A和B之间的路程是指需要从A到B最短路的长度。
输入的第一行是一个整数T(1 <= T <= 50),代表案例的个数。
然后T个案例,每个案例以两个数字 N, M (1 <= N <= 100, 1 <= M <= 40000) 开始,其中描述了国家X的城市数量和道路数量。每个案例每行由三行整数 x, y, s (1 <= x, y <= N, 1 <= s <= 10, x,y保证不相等), ,这意味着有一条路在城市x和城市y之间,它的长度是s。请注意,两个城市之间可能有不止一条道路。
对于每种情况,首先输出案例编号,然后输出可能关闭的道路编号。这个数字应该尽可能的大。
2 2 3 1 2 1 1 2 1 1 2 2 3 3 1 2 1 2 3 1 1 3 1Sample Output
Case 1: 2 Case 2: 0
思路:首先,删除两点间权值大的边,走一遍floyd,遍历所有点路径,查看能删除的路径。
#include<algorithm>
#include<string.h>
#include<stdio.h>
#define inf 0x3f3f3f3f
using namespace std;
int map[110][110],b[110][110];
int n,m;
int main()
{
int t,x,y,s,ans,ph=1;
scanf("%d",&t);
while(t--)
{
ans=0;
memset(map,0x3f,sizeof(map));
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
map[i][i]=0;
}
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&x,&y,&s);
if(map[x][y]!=inf)ans++;
if(map[x][y]>s)
{
map[x][y]=map[y][x]=s;
}
}
memcpy(b,map,sizeof(b));
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(map[i][j]>map[i][k]+map[k][j])
{
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
for(int k=1; k<=n; k++)
{
if(map[i][j]<b[i][j]&&b[i][j]!=inf)
{
ans++;
break;
}
if(b[i][j]==map[i][k]+map[k][j]&&b[i][j]!=inf&&j!=k&&i!=k)
{
ans++;
break;
}
}
}
}
printf("Case %d: ",ph++);
printf("%d\n",ans);
}
}