poj 1797 Dijkstra 变形

刚做完2253就做这题了。。和2253基本一样Dijkstra的变形,可以用dfs写,试了一下,但是好像又写了个最短路的递归版....

Dijkstra变形的时候注意找的是最大路径。虽然大致代码都自己编出来了,但是还是有好多细节没把握好,没能1a过。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define N 1000000
int map[1010][1010];
int n,m;
int lowcost[1010];
int vis[1010];
int Nn;
void Dijkstra()
{
    int i,j,k,maxt;
    int start=1;
    for(i=1;i<=n;i++)
        map[i][i]=N;
    for(i=1;i<=n;i++)
        lowcost[i]=map[start][i];
    vis[start]=true;
    for(i=1;i<=n;i++)           //m条边
    {
        maxt=0;
        for(j=1;j<=n;j++)
        {
            if((maxt<lowcost[j])&&!vis[j])             //变形,找最大值
            {
                maxt=lowcost[j];
                k=j;
            }
        }
        vis[k]=true;
        for(j=1;j<=n;j++)
        if(!vis[j]&&lowcost[j]<min(lowcost[k],map[k][j]))
        {
            lowcost[j]=min(lowcost[k],map[k][j]);
        }
    }
}
void input()
{
    int weight,i,j,x,y;
    cin>>n>>m;

    memset(map,0,sizeof(map));
    memset(lowcost,0,sizeof(lowcost));
    memset(vis,0,sizeof(lowcost));

    for(i=1;i<=m;i++)       //邻接矩阵的输入
    {
        cin>>x>>y;cin>>weight;
        map[x][y]=weight;
        map[y][x]=weight;
    }
}
int main()
{
    int T;
    cin>>T;
    Nn=0;
    while(T--)
    {
        Nn++;
        input();
        Dijkstra();
        cout<<"Scenario #"<<Nn<<":"<<endl;
        cout<<lowcost[n]<<endl;
        if(T)
        cout<<endl;
    }
    return 0;
}


 

原文地址:https://www.cnblogs.com/amourjun/p/5134227.html