Heavy Transportation

Background 
Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to the place where it is needed on which all streets can carry the weight. 
Fortunately he already has a plan of the city with all streets and bridges and all the allowed weights.Unfortunately he has no idea how to find the the maximum weight capacity in order to tell his customer how heavy the crane may become. But you surely know. 

Problem 
You are given the plan of the city, described by the streets (with weight limits) between the crossings, which are numbered from 1 to n. Your task is to find the maximum weight that can be transported from crossing 1 (Hugo's place) to crossing n (the customer's place). You may assume that there is at least one path. All streets can be travelled in both directions.

Input

The first line contains the number of scenarios (city plans). For each city the number n of street crossings (1 <= n <= 1000) and number m of streets are given on the first line. The following m lines contain triples of integers specifying start and end crossing of the street and the maximum allowed weight, which is positive and not larger than 1000000. There will be at most one street between each pair of crossings.

Output

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the maximum allowed weight that Hugo can transport to the customer. Terminate the output for the scenario with a blank line.

Sample Input

1
3 3
1 2 3
1 3 4
2 3 5

Sample Output

Scenario #1:
4
#include <iostream>
#include <queue>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
#define MAXV 1010


int map[MAXV][MAXV],n,m;
int vis[MAXV],d[MAXV];

int spfa(){
	queue <int>q;
	int v;

	for(int i=1;i<=n;i++){
		vis[i]=0;
		d[i]=0;
	}
	q.push(1);
	vis[1]=1;
	while(!q.empty()){
		v=q.front();q.pop();
		vis[v]=0;

		for(int i=1;i<=n;i++){
			if(v==1 && map[v][i]){
				d[i]=map[v][i];
				q.push(i);
				vis[i]=1;
				continue;
			}
			if(d[i]<min(d[v],map[v][i])){
				d[i]=min(d[v],map[v][i]);
				if(!vis[i]){
					vis[i]=1;
					q.push(i);
				}
			}
		}
	}
	return d[n];
}

int main(){
	int sum,a,b,c;
	scanf("%d",&sum);
	for(int t=1;t<=sum;t++){
		scanf("%d%d",&n,&m);

		for(int i=0;i<=n;i++)
			for(int j=0;j<=n;j++)
				map[i][j]=0;

		for(int i=1;i<=m;i++){
			scanf("%d%d%d",&a,&b,&c);
			map[a][b]=map[b][a]=c;
		}

		printf("Scenario #%d:\n",t);
		printf("%d\n\n",spfa());
	}
	return 0;
}

 


/*
4128K 375MS
Dijkstra邻接矩阵
*/
#include <iostream>
using namespace std;
#define MAXV 1010
#define min(a,b) (a<b?a:b)
 
int map[MAXV][MAXV],n,m;
 
int dijkstra(){
    int vis[MAXV],d[MAXV],i,j,v;
    for(i=1;i<=n;i++){
        vis[i]=0;
        d[i]=map[1][i];    //这个时候d不代表从1到n的最短路径,而是最大承载量
    }
    for(i=1;i<=n;i++){
        int f=-1;
        for(j=1;j<=n;j++)
            if(!vis[j] && d[j]>f){
                f=d[j];
                v=j;
            }
        vis[v]=1;
 
        for(j=1;j<=n;j++)
            if(!vis[j] && d[j]<min(d[v],map[v][j])){
                d[j]=min(d[v],map[v][j]);
            }
    }
    return d[n];
}
 
int main(){
    int t,i,j,sum,a,b,c;
    scanf("%d",&sum);
    for(t=1;t<=sum;t++){
        scanf("%d%d",&n,&m);
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
                map[i][j]=0;
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=map[b][a]=c;
        }
        printf("Scenario #%d:\n",t);
        printf("%d\n\n",dijkstra());
    }
    return 0;
}



========================================================================================



/*
spfa邻接矩阵
4156K 469MS 
*/
#include <iostream>
#include <queue>
using namespace std;
#define MAXV 1010
#define min(a,b) (a<b?a:b)
 
int map[MAXV][MAXV],n,m;
 
int spfa(){
    queue <int>q;
    int i,j,v;
    int vis[MAXV],d[MAXV];
    for(i=1;i<=n;i++){
        vis[i]=0;
        d[i]=0;
    }
    q.push(1);
    vis[1]=1;
    while(!q.empty()){
        v=q.front();q.pop();
        vis[v]=0;
 
        for(i=1;i<=n;i++){
            if(v==1 && map[v][i]){
                d[i]=map[v][i];
                q.push(i);
                vis[i]=1;
                continue;
            }
            if(d[i]<min(d[v],map[v][i])){
                d[i]=min(d[v],map[v][i]);
                if(!vis[i]){
                    vis[i]=1;
                    q.push(i);
                }
            }
        }
    }
    return d[n];
}
 
int main(){
    int t,i,j,sum,a,b,c;
    scanf("%d",&sum);
    for(t=1;t<=sum;t++){
        scanf("%d%d",&n,&m);
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
                map[i][j]=0;
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=map[b][a]=c;
        }
        printf("Scenario #%d:\n",t);
        printf("%d\n\n",spfa());
    }
    return 0;
}



================================================================================



/*
bellman-ford邻接矩阵
Time Limit Exceeded
*/
#include <iostream>
using namespace std;
#define MAXV 1010
#define min(a,b) (a<b?a:b)
 
int map[MAXV][MAXV],n,m;
 
int bellman_ford(){
    int i,j,v,k;
    int vis[MAXV],d[MAXV];
    for(i=1;i<=n;i++) d[i]=map[1][i];
 
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            for(k=1;k<=n;k++){
                if (d[k]<min(d[j],map[j][k]) && map[j][k])  d[k]=min(d[j],map[j][k]);
                if (d[j]<min(d[k],map[k][j]) && map[k][j])  d[j]=min(d[k],map[k][j]);
            }
        }
    }
    
    return d[n];
}
 
int main(){
    int t,i,j,sum,a,b,c;
    scanf("%d",&sum);
    for(t=1;t<=sum;t++){
        scanf("%d%d",&n,&m);
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
                map[i][j]=0;
            for(i=1;i<=m;i++){
                scanf("%d%d%d",&a,&b,&c);
                map[a][b]=map[b][a]=c;
            }
            printf("Scenario #%d:\n",t);
            printf("%d\n\n",bellman_ford());
    }
    return 0;
}



===================================================================================================



/*
760K 1532MS
bellman_ford邻接表
*/
#include <iostream>
using namespace std;
#define MAXV 1010
#define MAXE 1000010
#define min(a,b) (a<b?a:b)
 
struct {
    int s,e,w;
}edge[MAXE];
 
int n,m;
 
int bellman_ford(){
    int i,j,d[MAXV];
    for(i=1;i<=n;i++) d[i]=0;
 
    d[1]=0xffffff;
    
    for (i=1;i<n;i++){
        for (j=1;j<=m;j++){
            if (d[edge[j].e]<min(d[edge[j].s],edge[j].w))  d[edge[j].e]=min(d[edge[j].s],edge[j].w);
            if (d[edge[j].s]<min(d[edge[j].e],edge[j].w))  d[edge[j].s]=min(d[edge[j].e],edge[j].w);
         }  
    }
    
    return d[n];
}
 
int main(){
    int t,i,sum;
    scanf("%d",&sum);
    for(t=1;t<=sum;t++){
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&edge[i].s,&edge[i].e,&edge[i].w);
        }
        printf("Scenario #%d:\n",t);
        printf("%d\n\n",bellman_ford());
    }
    return 0;
}



================================================================================================



/*
760K 250MS
bell_ford邻接表优化
*/#include <iostream>
using namespace std;
#define MAXV 1010
#define MAXE 1000010
#define min(a,b) (a<b?a:b)
 
struct {
    int s,e,w;
}edge[MAXE];
 
int n,m;
 
int bellman_ford(){
    int i,j,d[MAXV];
    for(i=1;i<=n;i++) d[i]=0;
    
    d[1]=0xffffff;
    
    int flag=1;
    while(flag){
        flag=0;
        for (j=1;j<=m;j++){
            if (d[edge[j].e]<min(d[edge[j].s],edge[j].w))  {d[edge[j].e]=min(d[edge[j].s],edge[j].w);flag=1;}
            if (d[edge[j].s]<min(d[edge[j].e],edge[j].w))  {d[edge[j].s]=min(d[edge[j].e],edge[j].w);flag=1;}
        }  
    }
    
    return d[n];
}
 
int main(){
    int t,i,sum;
    scanf("%d",&sum);
    for(t=1;t<=sum;t++){
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&edge[i].s,&edge[i].e,&edge[i].w);
        }
        printf("Scenario #%d:\n",t);
        printf("%d\n\n",bellman_ford());
    }
    return 0;
}



=======================================================================================



/*
bellman-ford邻接矩阵优化
4124K 1485MS 
*/
#include <iostream>
using namespace std;
#define MAXV 1010
#define min(a,b) (a<b?a:b)
 
int map[MAXV][MAXV],n,m;
 
int bellman_ford(){
    int i,j,v,k;
    int vis[MAXV],d[MAXV];
    for(i=1;i<=n;i++) d[i]=map[1][i];
    
    int flag=1;
    while(flag){
        flag=0;
        for(j=1;j<=n;j++){
            for(k=1;k<=n;k++){
                if (d[k]<min(d[j],map[j][k]) && map[j][k])  {d[k]=min(d[j],map[j][k]);flag=1;}
                if (d[j]<min(d[k],map[k][j]) && map[k][j])  {d[j]=min(d[k],map[k][j]);flag=1;}
            }
        }
    }
    
    return d[n];
}
 
int main(){
    int t,i,j,sum,a,b,c;
    scanf("%d",&sum);
    for(t=1;t<=sum;t++){
        scanf("%d%d",&n,&m);
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
                map[i][j]=0;
            for(i=1;i<=m;i++){
                scanf("%d%d%d",&a,&b,&c);
                map[a][b]=map[b][a]=c;
            }
            printf("Scenario #%d:\n",t);
            printf("%d\n\n",bellman_ford());
    }
    return 0;
}

 

全部评论

相关推荐

10-04 17:25
门头沟学院 Java
snqing:Java已经饱和了,根本不缺人。随便一个2000工资的都200人起投递
点赞 评论 收藏
分享
oppo 应用软开 22*15+0.5*12
拿到了ssp完美:真的坎坷,但是你至少拿到这么多offer了!
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
441069次浏览 4495人参与
# 春招别灰心,我们一人来一句鼓励 #
41545次浏览 524人参与
# 阿里云管培生offer #
119981次浏览 2219人参与
# 地方国企笔面经互助 #
7937次浏览 18人参与
# 同bg的你秋招战况如何? #
75837次浏览 554人参与
# 虾皮求职进展汇总 #
114640次浏览 885人参与
# 北方华创开奖 #
107340次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454217次浏览 34849人参与
# 实习必须要去大厂吗? #
55703次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149846次浏览 1977人参与
# 投递实习岗位前的准备 #
1195775次浏览 18547人参与
# 你投递的公司有几家约面了? #
33182次浏览 188人参与
# 双非本科求职如何逆袭 #
661978次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4734次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157608次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11417次浏览 276人参与
# 发工资后,你做的第一件事是什么 #
12467次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35657次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20096次浏览 240人参与
# 我的上岸简历长这样 #
451947次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39252次浏览 314人参与
# 非技术岗是怎么找实习的 #
155859次浏览 2120人参与
牛客网
牛客企业服务