poj3767
来源:互联网 发布:淘宝卖家被诈骗57000 编辑:程序博客网 时间:2024/05/17 07:13
这道题目是上次在北大比赛的时候没做出来。
貌似过得人挺多的,大多数人的算法是两次最短路+枚举
我写的时候发现太麻烦了,后来看到有人说一次就可以了。
这道题考你对最短路的理解。无向图加有向。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define inf 100000000
int N,M;
int map[610][610];
int city[610];
int dis1[610];
int used1[610];
void dij()
{
int i,j,min1,k1;
dis1[1]=0;
//used1[1]=1;
for(i=1;i<N;i++)
{
min1=inf;
for(j=1;j<=N;j++)
{
if(!used1[j]&&min1>dis1[j])
{
k1=j;
min1=dis1[j];
}
}
if(k1==2)break;
used1[k1]=1;
for(j=1;j<=N;j++)
{
if(!used1[j]&&dis1[j]>dis1[k1]+map[k1][j])
{
dis1[j]=dis1[k1]+map[k1][j];
}
}
}
if(dis1[2]<map[1][1])printf("%d/n",dis1[2]); else printf("-1/n");
}
int main()
{
int a,b,d,i,j;
while(scanf("%d",&N),N)
{
memset(map,0x1f,sizeof(map));//初始化一个很大的值
memset(used1,0,sizeof(used1));
memset(dis1,0x1f,sizeof(dis1));
scanf("%d",&M);
for(i=0;i<M;i++)
{
scanf("%d%d%d",&a,&b,&d);
map[a][b]=d;
map[b][a]=d;
}
for(i=1;i<=N;i++)
scanf("%d",&city[i]);
for(i=1;i<N;i++)
{
for(j=i+1;j<=N;j++)
{
if(city[i]==city[j])
continue;
else if(city[i]==1&&city[j]==2)//如果不在一个集合里,单向
map[j][i]=map[1][1];
else if(city[i]==2&&city[1]==1)//同上
map[i][j]=map[1][1];
}
}
dij();
}
return 0;
}
- poj3767
- poj3767
- POJ3767----I Wanna Go Home
- 最短路径问题 POJ3767
- POJ3767 I Wanna Go Home dijkstra
- Qt 4.6.2在VS2005,VS2008,MinGW环境下的静态编译
- 国外最牛的Php开源建站平台
- 难道说我很小心眼?
- 高效获取随机数组的方法
- project小技巧:如何删除摘要任务
- poj3767
- word中显示删除内容
- 新的开始-5-15
- amcharts动态生成数据
- 传智播客JAVA培训OA项目 审批流转模块
- 无法访问,您可能没有权限使用网络资源的解决方法
- SQL逻辑查询处理顺序
- Use Haskell ByteString to Read/Write File
- BI介绍(1)