数据结构与算法实验题7.1 M 商人的求救
2013-12-25 16:47
274 查看
问题描述:
A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M
先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去。
M 先生说:“为了安全起见,我们的路线最多只能包含一条连接两股不同势力城市的道
路”。M 先生想知道最快多久能到达目的地。
数据输入:
第一行N(2<=N<=600),代表城市个数。第二行M(0<=M<=10000),代表道路条数。
接下来M 行每行三个数A,B,T。代表一条从城市A 到城市B 的路(双向边)需要耗时
T(1<=T<=1500)。
接下来一行N 个数,这些数只会是1 或者2,第i 个数字代表第i 个城市属于第几股势
力。
为了简化问题,我们假设开始时M 先生在城市1,目的地是城市2,城市1 属于第1 股
势力,城市2 属于第2 股势力。
道路是双向的。数据保证没有重边。
结果输出:
输出最少需要的时间。如果无法到达则输出-1。
输入示例: 输出示例:
2
1
1 2 100
1 2
100
3
3
1 2 100
1 3 40
2 3 50
1 2 1
90
5
5
3 1 200
5 3 150
2 5 160
4 3 170
4 2 170
1 2 2 2 1
540
并查集+dijstra算法
View Code
A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M
先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去。
M 先生说:“为了安全起见,我们的路线最多只能包含一条连接两股不同势力城市的道
路”。M 先生想知道最快多久能到达目的地。
数据输入:
第一行N(2<=N<=600),代表城市个数。第二行M(0<=M<=10000),代表道路条数。
接下来M 行每行三个数A,B,T。代表一条从城市A 到城市B 的路(双向边)需要耗时
T(1<=T<=1500)。
接下来一行N 个数,这些数只会是1 或者2,第i 个数字代表第i 个城市属于第几股势
力。
为了简化问题,我们假设开始时M 先生在城市1,目的地是城市2,城市1 属于第1 股
势力,城市2 属于第2 股势力。
道路是双向的。数据保证没有重边。
结果输出:
输出最少需要的时间。如果无法到达则输出-1。
输入示例: 输出示例:
2
1
1 2 100
1 2
100
3
3
1 2 100
1 3 40
2 3 50
1 2 1
90
5
5
3 1 200
5 3 150
2 5 160
4 3 170
4 2 170
1 2 2 2 1
540
并查集+dijstra算法
#include<cstdio> #include<cstdlib> #include<cstring> #define inf 0xffffff int g[601][601]; struct ufs { int parent[1000]; }u; int find(int e) { if(e!=u.parent[e]) u.parent[e]=find(u.parent[e]); return u.parent[e]; } void funion(int i,int j) { u.parent[i]=j; } void dijstra(int n) { int lowcost[601],used[601],min,i,j,k; memset(used,0,sizeof(used)); for(i=1;i<=n;i++) lowcost[i]=g[i][1]; used[1]=1; for(i=1;i<n;i++) { j=1; min=inf; for(k=2;k<=n;k++) { if(lowcost[k]<min&&!used[k]) min=lowcost[k], j=k; } used[j]=1; for(k=2;k<=n;k++) { int t1=find(k),t2=find(j),t3=find(1); if(t1==t3&&t2!=t1)//横跨两股势力 { } else { if(g[k][j]+lowcost[j]<lowcost[k]&&!used[k]) lowcost[k]=g[k][1]=g[1][k]=g[k][j]+lowcost[j]; } } } } int main() { int n,m,i,a,b,j,t; scanf("%d %d",&n,&m); for(i=1;i<=n;i++) u.parent[i]=i; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) g[i][j]=inf; g[i][i]=0; } for(i=1;i<=m;i++) { scanf("%d %d %d",&a,&b,&t); g[a][b]=g[b][a]=t; } for(i=1;i<=n;i++) { scanf("%d",&a); if(a==1) funion(i,1); else if(a==2) funion(i,2); } dijstra(n); if(g[1][2]==inf) printf("-1\n"); else printf("%d\n",g[1][2]); return 0; }
View Code
5910 | 031202110 | M.cpp | AC|AC|AC|AC|AC|AC|AC|AC|AC|AC| | 77MS | 1660KB |
相关文章推荐
- 数据结构与算法实验题 7.1 M 商人的求救
- 数据结构与算法实验题 7.1 M 商人的求救
- 数据结构与算法实验题-大招秒杀
- 数据结构与算法-实验5-自动产生随机数,并实现对数的排序
- 数据结构与算法实验题7.2 连环计
- 实验题7.1: 编写一个程序algo7-1.cpp,实现二叉树的各种基本运算,并在此基础上设计一个程序Main.cpp完成如下功能(b为如下图所示的一棵二叉树)
- 数据结构与算法实验题 9.1 K 歌 DFS+剪枝
- 数据结构与算法实验题 9.1 K 歌 DFS+剪枝
- 数据结构与算法实验题 5.2 排序
- 数据结构与算法·实验一
- c#实验7.1百分制转为五分制
- 数据结构与算法·实验二
- 2012C++程序设计实验报告【7.1】
- 数据结构与算法实验题 10.1 神谕者
- 数据结构与算法实验题 6.1 s_sin’s bonus
- 数据结构与算法实验题 10.1 神谕者
- 福大数据结构与算法实验题 Who is behind(双端队列)
- 数据结构与算法实验题 7.2 连环计
- 数据结构与算法实验题 7.2 连环计
- 数据结构与算法实验题 6.1 s_sin’s bonus