首页 > 学院 > 开发设计 > 正文

poj 3268 Silver Cow Party

2019-11-06 06:50:59
字体:
来源:转载
供稿:网友

Silver Cow Party

题目链接:http://poj.org/PRoblem?id=3268

题目大意:在所有的牛场中选一个,其他牛场的牛都会走个来会,路径是单向的,在所有的来回中求个最大的。数据是1000,如果用弗洛伊德O(n^3)h会超时;

所以这里用迪杰斯特拉,但是还必须用一个小技巧,题目要求都与X农场有关,到X和从X出发。所以可以在函数里动手脚,也可以在map里面做文章。

代码如下:

#include<iostream>  #include<cstdio>  #include<cstring>  using namespace std;  #define INF 0x3f3f3f3; int map[1005][1005],dis[1005],visited[1005];  int xx[1005],nn[1005];int map2[1005][1005];void Dj(int n,int x)  {      int p;      for(int i=1;i<=n;i++)      {          dis[i]=map[x][i];          visited[i]=0;    }    visited[x]=1;    for(int i=1;i<=n;i++)      {          int min=INF;        for(int j=1;j<=n;j++)        {              if(!visited[j] && dis[j]<min)                   {                  p=j;                  min=dis[j];              }          }          visited[p]=1;             for(int j=1;j<=n;j++)          {              if(!visited[j] && dis[p]+map[p][j]<dis[j])                  {                      dis[j]=dis[p]+map[p][j];            }          }      }  }    int main()  {      int n,m,r;    int x,y,d;    while(~scanf("%d%d%d",&n,&m,&r))    {          for(int i=1;i<=n;i++)             for(int j=1;j<=n;j++)                 map[i][j]=map2[i][j]=INF;         for(int i=1;i<=m;i++)         {              scanf("%d%d%d",&x,&y,&d);              map[x][y]=d;            map2[y][x]=d;        }               	Dj(n,r);       	for(int j=1;j<=n;j++)        {       		xx[j]=dis[j];		}		for(int i=1;i<=n;i++)             for(int j=1;j<=n;j++)                 map[i][j]=map2[i][j];		Dj(n,r);       	for(int j=1;j<=n;j++)        {       		nn[j]=dis[j];		}		int MAX=-1;		for(int i=1;i<=n;i++)		{			if(i!=r)			{				if(nn[i]+xx[i]>MAX)					MAX=nn[i]+xx[i];			}		}        printf("%d/n",MAX);    }    return 0;  }  


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表