您的位置:首页 > 其它

【最短路】poj1797 类SPFA

2015-07-14 13:58 309 查看
题意:翻译来自scy

Description

T组数据。每组数据有n个点m条双向边,问从1到n的路径上的最小的边最大是多少。

如数据1中路径1->2->3的最小边为3,1->3的最小边为4,取最大值为4

Input

第一行是数据组数T

第二行为n(1 <= n <= 1000)、m

接下来m行,每行是u,v,c,代表u、v之间有一条边权为c的双向边c<=1000000

Output

每个样例第一行输出"Scenario #i:",i为第几组数据。

接下来输出1到n的路径上的最小的边最大值

每组数据输出后输出一个空行

Sample Input

1

3 3

1 2 3

1 3 4

2 3 5

Sample Output

Scenario #1:

4

做法其实十分类似SPFA(简直一模一样),只是d数组定义改为出发点到点i的最小边的最大值。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;

const int N=1100,INF=(int)1e6;
int n,m,len;
int first
,d
;
bool vis
;
struct node{
int x,y,d,next;
}a[N*N];

void ins(int x,int y,int t)
{
len++;
a[len].x=x;a[len].y=y;a[len].d=t;
a[len].next=first[x];first[x]=len;
}

int main()
{
int T,i,j;
scanf("%d",&T);
for(int TT=1;TT<=T;TT++)
{
printf("Scenario #%d:\n",TT);
scanf("%d%d",&n,&m);
len=0;
memset(first,0,sizeof(first));
for(i=1;i<=m;i++)
{
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
ins(x,y,t);
ins(y,x,t);
}
d[1]=INF;
for(i=2;i<=n;i++) d[i]=0;
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(1);
while(!q.empty())
{
int x=q.front();q.pop();
vis[x]=1;
for(i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(min(d[x],a[i].d)>d[y])
{
d[y]=min(d[x],a[i].d);
if(!vis[y])
{
vis[y]=1;
q.push(y);
}
}
}
vis[x]=0;
}
printf("%d\n",d
);
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图论 最短路