[洛谷]P2910 [USACO08OPEN] Clear And Present Danger S

floyed简单:

主要是要理解题意:

关键

for(int i=2;i<=m;i++){
  	ans+=mp[a[i-1]][a[i]];
  }

想复杂了:直接floyed,然后直接ans+=mp[a[i-1]][a[i]],直接就是从前一个必经点到下一个必经点

跑就行

555555

ACcode(附上):


#include
using namespace std;
#define int long long
const int N=1e2+10;
int mp[N][N],n,m,a[N],ans;
void floyed(){
	for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++){
		mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
	}
}
void solve() {
 cin>>n>>m;
 for(int i=1;i<=m;i++) cin>>a[i];
 for(int i=1;i<=n;i++){
 	for(int j=1;j<=n;j++){
 		cin>>mp[i][j];
	 }
 }
  floyed();
  for(int i=2;i<=m;i++){
  	ans+=mp[a[i-1]][a[i]];
  }
  cout<>tt;
	while(tt--) {
		solve();
	}
	return 0;
}

你可能感兴趣的:(图论,算法,c++)