题意:
给出n个点(N<=200),m条边的无向图,按从小到大的顺序输出出该图能进行松弛操作的点。
思路:
第一眼看到直接来Floyd暴力,先全部做完,找到松弛完后的最小路径。然后再枚举每一个点,把每一个点依次去掉。如果去掉该点后最短路径长度有变化,那么这一个点就是能进行松弛操作的点(即最重要的城市)。
代码如下(收到大佬Parabola的启发):
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int e[205][205],d[205][205],m,n,map[205][205];
priority_queue<int> q;
bool check(int x)//判断该点是否为重要的节点
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=e[i][j];
for(int k=1;k<=n;k++)
{
if(k==x) continue;//去掉该点
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j]>d[i][j])
return true;
return false;
}
int main()
{
scanf("%d%d",&am