1 条题解
-
1
x_miracle LV 4 @ 4 年前
很神奇的是,VOJ上过了,洛谷却没过。。。
- 1
信息
- 难度
- 8
- 分类
- (无)
- 标签
- 递交数
- 91
- 已通过
- 13
- 通过率
- 14%
- 被复制
- 1
- 上传者
#include <bits/stdc++.h>
#define MAXN 510
#define MAX 0x3f3f3f3f
using namespace std;
int ori=1,node;
//ori 起点 node 节点数
int a[5005];
//存输入
int dis[MAXN],g[MAXN][MAXN];
bool vis[MAXN];
void init()
{
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
vis[ori]=1;
for(int i=1;i<=node;++i) dis[i] = (i == ori ? 0 : g[ori][i]);
}
void Dijkstra()
{
int k;
init();
for(int i=1;i<=node-2;++i)
{
int m=MAX;
for(int j=1;j<=node;++j)
{
if(dis[j]<m && vis[j]==0)
{m=dis[j]; k=j;}
}
if(m==MAX) break;
vis[k]=1;
for(int j=1;j<=node;++j)
if(dis[k]+g[k][j]<dis[j])
dis[j]=dis[k]+g[k][j];
}
return ;
}
int main()
{
int edge;
scanf("%d%d",&edge,&node);
for(int i=1;i<=node;++i)
for(int j=1;j<=node;++j)
g[i][j]=MAX;
for(int i=1;i<=edge;++i)
{
memset(a,0,sizeof(a));
int n=0; //计数器
char c=1;
while(c!=-1 && c!='\n')
{
scanf("%d",&a[ ++n ]);
c=-1;
scanf("%c",&c);
}
for(int j=1;j<n;++j)
for(int k=j+1;k<=n;++k)
g[ a[j] ][ a[k] ]=1;
}
Dijkstra();
if(dis[node]>=MAX) printf("NO");
else printf("%d",dis[node]-1);
return 0;
}
很神奇的是,VOJ上过了,洛谷却没过。。。