SGU 226
2015-08-27 20:28
323 查看
题目大意:给出一张图,每条边都有一个颜色,求1到n的最短路,要求路径上不能有两相邻边颜色相同。
题解:本来写了个裸SPFA,WAon5看了讨论区的数据才知道不能直接判断边的颜色然后跑SPFA,应该设d
[k]表示第n个点,由第k个颜色过来的最短路,也就是加一维跑SPFA。给我的感觉是:做不出就加一维。
%%%__debug大神。
题解:本来写了个裸SPFA,WAon5看了讨论区的数据才知道不能直接判断边的颜色然后跑SPFA,应该设d
[k]表示第n个点,由第k个颜色过来的最短路,也就是加一维跑SPFA。给我的感觉是:做不出就加一维。
%%%__debug大神。
#include<cstdio> #include<cstdlib> #include<algorithm> #include<iostream> #include<cstring> #include<queue> #define INF 0x7fffffff/10 #define MP make_pair #define x first #define y second using namespace std; const int MAXN=201,MAXM=201*201; typedef pair<int,int> pii; int first[MAXN],n,m,d[MAXN][5],inq[MAXN][5],e=0; struct Edge{ int u,v,next,id,w; }bian[MAXM]; void add(int a,int b,int c) { ++e;bian[e].next=first[a];first[a]=e;bian[e].u=a; bian[e].v=b;bian[e].id=c;bian[e].w=1; } void SPFA() { queue<pii> q; q.push(MP(1,4)); inq[1][4]=1; while(!q.empty()) { pii fr=q.front();q.pop(); inq[fr.x][fr.y]=0; int u=fr.x; for(int i=first[u];i!=-1;i=bian[i].next) { Edge &e=bian[i]; int v=e.v; if(fr.y!=e.id) { if(d[u][fr.y]+1<d[v][e.id]) { d[v][e.id]=d[u][fr.y]+1; if(!inq[v][e.id]) { inq[v][e.id]=1; q.push(MP(v,e.id)); } } } } } } int main() { freopen("226.in","r",stdin); freopen("226.out","w",stdout); scanf("%d %d",&n,&m); for(int i=1;i<=n;i++)first[i]=-1; for(int i=1;i<=m;i++) { int a,b,c; scanf("%d %d %d",&a,&b,&c); add(a,b,c); } for(int i=1;i<=n;i++)d[i][0]=d[i][1]=d[i][2]=d[i][3]=i==1?0:INF; SPFA(); if(d [1]==d [2]&&d [2]==d [3]&&d [3]==INF) printf("-1\n"); else printf("%d\n",min(d [1],min(d [2],d [3]))); }
相关文章推荐
- iOS多线程(GCD)(swift)
- 指针和二维数组的关系
- SQL中存储过程和自定义函数的区别
- T4M在Unity5中运行出错修改
- 3172 Virtual Friends【并查集】
- Java基于数组和循环实现的控制台五子棋
- acm hdu p2547 无剑无我{水水水}
- html中网页重定向效果
- 成员变量&&局部变量
- 好的android开发习惯
- iOS-汤姆猫项目总结
- Python语法基础——关于全局变量与局部变量
- Toast(提示信息),Dialog(弹窗).
- axis2的一个小例子
- 23种设计模式学习一(单列模式)singleton
- Android UI 绘制过程浅析(三)layout过程
- c/c++左值和右值
- 如何安装安装nginx软件--nginx的自动安装
- Thinking in Java笔记
- UVA 1146 2-SAT