HDU 4370 Dijkstra + 非自环正权回路

//先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;
}

猜你喜欢

转载自blog.csdn.net/shadandeajian/article/details/81293624