POJ1797

//思路:使用Dijkstra变形做的
#include <iostream>
#include <stdio.h>
using namespace std;
int n,m;
int num;
int dis[1001][1001]; //存储图的临界矩阵
int d[1001];   //存储最短距离
bool flag[1001];  //存储是否找到了最短路
void Dij()
{
 int max;
 int v = 0;
 flag[1] = true;
 d[1] = 0;
 for(int i1=2;i1<n+1;++i1)
 {
  d[i1] = dis[1][i1];
 }
 for(int i2=2;i2<n+1;++i2)  //外层循环,进行n-1循环
 {
  max = 0;
  for(int i3=2;i3<n+1;++i3)
  {
   if(!flag[i3] && d[i3]>max) //此处与Dijkstra不同,这里找的是最大边
   {
    max = d[i3];
    v = i3;
   }
  }
  flag[v] = true;
  for(int i4=2;i4<n+1;++i4)
  {
   if(!flag[i4])
   {
    if(dis[v][i4]>max) //如果后面边的权值大于前面边的值,则将后面边的点的距离设置为前面边的权值
    {
     d[i4] = max;
    }
    else if(dis[v][i4]>d[i4]) //此处主要是进行初始化,将d[i4]=0的值进行改变
    {
     d[i4] = dis[v][i4];
    }
   }
  }
 }
 cout<<"Scenario #"<<num<<":"<<endl
  <<d[n]<<endl<<endl;    //此处输出的是d[n],不是d[]中的最大值
}
int main()
{
 //freopen("1.txt","r",stdin);
 int t;
 cin>>t;
 num = 0;
 for(int i1=0;i1<t;++i1)
 {
  cin>>n>>m;
  memset(dis,0,sizeof(dis));//二维数组也可以使用memset进行初始化
  memset(d,0,sizeof(d));
  memset(flag,0,sizeof(flag));
  for(int i2=0;i2<m;++i2)
  {
   int start,end;
   int weight;
   cin>>start>>end>>weight;
   dis[start][end] = weight;
   dis[end][start] = weight;
  }
  num++;
  Dij();
 }
 //fclose(stdin);
 return 0;
}

posted @ 2010-04-25 20:28  北海小龙  阅读(344)  评论(0编辑  收藏  举报