标签:sgu
题目大意:给出一张图,每条边都有一个颜色,求1到n的最短路,要求路径上不能有两相邻边颜色相同。
题解:本来写了个裸SPFA,WAon5看了讨论区的数据才知道不能直接判断边的颜色然后跑SPFA,应该设d[n][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[n][1]==d[n][2]&&d[n][2]==d[n][3]&&d[n][3]==INF) printf("-1\n"); else printf("%d\n",min(d[n][1],min(d[n][2],d[n][3]))); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:sgu
原文地址:http://blog.csdn.net/sakai_masato/article/details/48034873