POJ 1502 MPI Maelstrom (dijkstra裸题)

普通版:

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#define ll long long
#define mod 1000000007
#define mod1 10001
#define mem(a) memset(a,0,sizeof(a))

using namespace std;

const int maxn = 100 + 5 , inf = 0x3f3f3f3f ;
int m,n,G[maxn][maxn],d[maxn],f[maxn],vis[maxn];
void Init(){
    for(int i = 1 ; i <= n ; i++ )
    for(int j = 1 ; j <= n ; j ++ ){
        if(i==j) G[i][j] = 0;
        else G[i][j] = inf;
    }
}
void dijkstra(int u){
    mem(vis);
    for(int i = 1 ; i <=n ; i ++ ) d[i] = inf;
    d[u] = 0;
    for(int i = 1 ; i <= n ; i ++ ){
        int minn = inf;
        int pos = 0;
        for(int j = 1 ; j <= n ; j ++ ){
            if(!vis[j]&&minn>d[j]){
                pos = j ;
                minn = d[j];
            }
        }
        vis[pos] = 1;
        for(int j = 1 ; j <=n ; j ++ ){
            if(d[j]>d[pos]+G[pos][j]&&G[pos][j]!=inf){
                d[j] = d[pos] + G[pos][j];
                f[j] = pos;
            }
        }
    }
}
int main(){
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    while(scanf("%d",&n)!=EOF){
        Init();
        for(int i = 2 ; i<=n ; i ++ ){
            for(int j = 1 ; j < i ; j ++ ){
                char s[10];
                scanf("%s",s);
                if(s[0]!='x') G[i][j] = G[j][i] = atoi(s);
            }
        }
        dijkstra(1);
        int ans = -1;
        for(int i=2;i<=n;i++) ans = max(ans,d[i]);
        printf("%d\n",ans);
    }
}

队列优化版:

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#define ll long long
#define mod 1000000007
#define mod1 10001
#define mem(a) memset(a,0,sizeof(a))
using namespace std;

typedef pair <int,int> pii;
const int maxn = 100 + 5 , inf = 0x3f3f3f3f ;
int m,n,G[maxn][maxn],d[maxn],f[maxn],vis[maxn];
void Init(){
    for(int i = 1 ; i <= n ; i++ )
    for(int j = 1 ; j <= n ; j ++ ){
        if(i==j) G[i][j] = 0;
        else G[i][j] = inf;
    }
}
void dijkstra(int qp){
    for(int i = 1 ; i <= n ; i ++ ) d[i] = inf; d[qp] = 0;
    priority_queue<pii,vector<pii>,greater<pii> >q;
    q.push(pii(d[qp],qp));
    mem(vis);
    while(!q.empty()){
        pii now = q.top(); q.pop();
        int u = now.second;
        if(vis[u]) continue;
        vis[u] = 1;
        for(int i = 1 ; i <= n ; i ++ ){
            if(d[i] > d[u] + G[u][i] && G[u][i] != inf){
                f[i] = u;
                d[i] = d[u] + G[u][i];
                q.push(pii(d[i],i));
            }
        }
    }
}
int main(){
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    while(scanf("%d",&n)!=EOF){
        Init();
        for(int i = 2 ; i<=n ; i ++ ){
            for(int j = 1 ; j < i ; j ++ ){
                char s[10];
                scanf("%s",s);
                if(s[0]!='x') G[i][j] = G[j][i] = atoi(s);
            }
        }
        dijkstra(1);
        int ans = -1;
        for(int i=2;i<=n;i++) ans = max(ans,d[i]);
        printf("%d\n",ans);
    }
}

猜你喜欢

转载自blog.csdn.net/insist_77/article/details/80882275