//先01规划 思维构图 自己是构想不出来 参考了kuangbin的博客
//然后就是找1到n的最短路 这是第一种情况
//然后还有非自环正权回路 这是第二种情况
//本程序采用了Dijkstra找非自环正权回路
//据说spfa也可以找非自环正权回路
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxv=310;
const long long INF=0x3f3f3f3f;
long long mmap[maxv][maxv],dis[maxv];
bool visit[maxv];
void Dijkstra(int s,int n,long long& cir){
for(int i=1;i<=n;i++){
dis[i]=INF;
visit[i]=false;
}
dis[s]=0;
visit[s]=true;
for(int j=1;j<=n;j++){
int k=s;
long long mmin=INF;
for(int i=1;i<=n;i++){
if(visit[i]==false&&dis[i]<mmin){
mmin=dis[i];
k=i;
}
}
visit[k]=true;
for(int i=1;i<=n;i++){
if(visit[i]==false&&dis[i]>dis[k]+mmap[k][i])
dis[i]=dis[k]+mmap[k][i];
if(i==s&&s!=k)
cir=min(cir,dis[k]+mmap[k][i]);
}
}
}
int main(void){
#ifndef ONLINE_JUDGE
freopen("E:\\input.txt","r",stdin);
#endif // ONLINE_JUDGE
ios::sync_with_stdio(false);
int n;
while(cin>>n){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>mmap[i][j];
long long cir1=INF,cir2=INF,temp;
Dijkstra(1,n,cir1);
temp=dis[n];
Dijkstra(n,n,cir2);
cout<<min(temp,cir1+cir2)<<endl;
}
return 0;
}
HDU 4370 Dijkstra + 非自环正权回路
猜你喜欢
转载自blog.csdn.net/shadandeajian/article/details/81293624
今日推荐
周排行