洛谷 P2559 [AHOI2002]哈利·波特与魔法石
题目描述
输入输出格式
输入格式:
文件中第一行有七个数,分别是 S1、 S2 、 …、 S7 ;第二行有两个数,依次分别是起点城市 i 和终点城市 j ;第三行有一个正整数 c ,c<=10000, 表示随后的 c 行中每行存放了一对能直接通达的城市的信息。 能直接通达的城市的信息由三个数组成, 依次分别是两个城市的编号和这两个城市之间的地形。城市的编号都是不超过 100 的正整
数, 但是各个城市的编号未必连续。 文件里同一行中相邻的两个数都是用一个空白字符隔开的。
输出格式:
以一行的形式输出起点城市i 与终点城市 j 之间的最快路线所需要的时间。
输入输出样例
输入样例#1: 复制
0 1 0 0 0 0 0
1 4
4
1 2 1
1 3 1
2 4 2
3 4 3
输出样例#1: 复制
5
思路:spfa搞一下就可以了。
#include<cstdio> #include<queue> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 10010 using namespace std; queue<int>que; int S[8]; int s,t,m,tot; int dis[MAXN],vis[MAXN]; int num[8]={0,2,6,4,8,6,10,14}; int to[MAXN*2],cap[MAXN*2],net[MAXN*2],head[MAXN]; void add(int u,int v,int w){ to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot; to[++tot]=u;net[tot]=head[v];cap[tot]=w;head[v]=tot; } void spfa(int s){ memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); que.push(s); vis[s]=1;dis[s]=0; while(!que.empty()){ int now=que.front(); que.pop(); vis[now]=0; for(int i=head[now];i;i=net[i]) if(dis[to[i]]>dis[now]+cap[i]){ dis[to[i]]=dis[now]+cap[i]; if(!vis[to[i]]){ vis[to[i]]=1; que.push(to[i]); } } } } int main(){ for(int i=1;i<=7;i++) scanf("%d",&S[i]); scanf("%d%d",&s,&t); scanf("%d",&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); if(S[z]==1) add(x,y,num[z]/2); else add(x,y,num[z]); } spfa(s); cout<<dis[t]; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。