(2750)ZOJ
来源:互联网 发布:北京软件大学 编辑:程序博客网 时间:2024/06/15 23:35
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define MAXN 1009
/*
题意:成语接龙
想法:单源最短路
*/
using namespace std;
int n;
int Edge[MAXN][MAXN];
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
struct node
{
char f[5];
char e[5];
int w;
} p[MAX];
void Dijstra(int v0)
{
int i,j,k;
for(i = 0; i<n; i++)
{
dist[i] = Edge[v0][i];
s[i] = 0;
}
s[v0] = 1;
dist[v0] = 0;
for(i = 0; i<n; i++)
{
int min = INF;
int u = 0;
for(j = 0; j<n; j++)
{
if(!s[j]&&dist[j]<min)
{
u = j;
min = dist[j];
}
}
s[u] = 1;
for(k = 0; k<n; k++)
{
if(!s[k]&&(dist[u]+Edge[u][k]<dist[k])&&Edge[u][k]<INF)
{
dist[k] = dist[u]+Edge[u][k];
}
}
}
}
int main()
{
char str[109];
int m;
while(~scanf("%d",&n)&&n)
{
for(int i = 0; i<n; i++)
{
scanf("%d%s",&p[i].w,str);
for(int j = 0; j<4; j++)
{
p[i].f[j] = str[j];
}
p[i].f[4] = '\0';
int k = 0;
for(int j = strlen(str) - 4; j<=strlen(str) - 1; j++)
{
p[i].e[k++] = str[j];
}
p[i].e[k] = '\0';
//cout<<p[i].f<<"xxxxxxxx"<<p[i].e<<endl;
}
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
Edge[i][j] = INF;
if(i==j)continue;
if(strcmp(p[i].e,p[j].f)==0)
{
Edge[i][j] = p[i].w;
}
}
}
Dijstra(0);
if(dist[n-1]==INF) puts("-1");
else
printf("%d\n",dist[n-1]);
}
return 0;
}
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define MAXN 1009
/*
题意:成语接龙
想法:单源最短路
*/
using namespace std;
int n;
int Edge[MAXN][MAXN];
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
struct node
{
char f[5];
char e[5];
int w;
} p[MAX];
void Dijstra(int v0)
{
int i,j,k;
for(i = 0; i<n; i++)
{
dist[i] = Edge[v0][i];
s[i] = 0;
}
s[v0] = 1;
dist[v0] = 0;
for(i = 0; i<n; i++)
{
int min = INF;
int u = 0;
for(j = 0; j<n; j++)
{
if(!s[j]&&dist[j]<min)
{
u = j;
min = dist[j];
}
}
s[u] = 1;
for(k = 0; k<n; k++)
{
if(!s[k]&&(dist[u]+Edge[u][k]<dist[k])&&Edge[u][k]<INF)
{
dist[k] = dist[u]+Edge[u][k];
}
}
}
}
int main()
{
char str[109];
int m;
while(~scanf("%d",&n)&&n)
{
for(int i = 0; i<n; i++)
{
scanf("%d%s",&p[i].w,str);
for(int j = 0; j<4; j++)
{
p[i].f[j] = str[j];
}
p[i].f[4] = '\0';
int k = 0;
for(int j = strlen(str) - 4; j<=strlen(str) - 1; j++)
{
p[i].e[k++] = str[j];
}
p[i].e[k] = '\0';
//cout<<p[i].f<<"xxxxxxxx"<<p[i].e<<endl;
}
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
Edge[i][j] = INF;
if(i==j)continue;
if(strcmp(p[i].e,p[j].f)==0)
{
Edge[i][j] = p[i].w;
}
}
}
Dijstra(0);
if(dist[n-1]==INF) puts("-1");
else
printf("%d\n",dist[n-1]);
}
return 0;
}
0 0
- ZOJ-2750
- (2750)ZOJ
- ZOJ Problem Set - 2750
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- F_GETLK与F_SETLK的使用
- 在继承中重写方法时抛出异常的问题
- cocos2d-x 画物理齿轮
- Python解析Json
- CentOS6.5安装Apache服务
- (2750)ZOJ
- fstream的使用方法介绍
- build_native.py文件分析(1)
- Laravel5 container & service provider
- mysql数据库实际上没有,还去访问
- 仿照网易新闻旧版本左拉的列表动画效果
- 第34课时,实践1,分数的累加
- xcode git(2)简单示例
- 【C语言】球从100米自由落下,每次落地后反跳回原高度的一半。当10次落地时,共经过多少米,第10次反弹多高。