POJ 1797 最短路

来源:互联网 发布:淘宝上的组装机怎么样 编辑:程序博客网 时间:2024/05/07 01:43
//11102903c00h00g1797Accepted4364K407MSG++1481B2012-12-12 22:30:50//最短路径重新定义为:从1-n的一条路径中,最短的那条边的长度。然后求出所有最短边中的最大值 //只是贪心的策略改变了,每次查找最大的d进行松弛 #include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;#define INF 999999999//n交叉路口数,m边的个数 int n,m;int mat[1005][1005];int d[1005];int vis[1005]; int N;int main(){    scanf("%d",&N);    int cases=0;     while(N--){        cases++;        scanf("%d%d",&n,&m);        //初始化        memset(mat,-1,sizeof(mat));        memset(d,-1,sizeof(d));         memset(vis,0,sizeof(vis));        int a,b,w;        for(int i=0;i<m;i++){            scanf("%d%d%d",&a,&b,&w);            mat[a][b]=mat[b][a]=w;        }                //dijkstra i用来表示循环的次数         d[1]=INF;        vis[1]=true;        for(int i=2;i<=n;i++){            if(mat[1][i]!=-1){                d[i]=mat[1][i];            }        }        for(int i=0;i<n-2;i++){            int minF=-INF;            int v=0;            //查找最大值             for(int j=1;j<=n;j++){                if(vis[j]==0&&d[j]!=-1){                    if(d[j]>minF){                        minF=d[j];                        v=j;                    }                }            }                        vis[v]=1;            for(int j=1;j<=n;j++){                if(vis[j]==0&&mat[v][j]!=-1&&d[j]<min(d[v],mat[v][j])){                    d[j]=min(d[v],mat[v][j]);                }            }        }                printf("Scenario #%d:\n",cases);        printf("%d\n\n",d[n]);    }    return 0;}

原创粉丝点击