vijos1089——小胖抗日

来源:互联网 发布:派发优惠券软件 编辑:程序博客网 时间:2024/06/05 09:00

第一版的高分题啊 好水啊。。。。。
二维标记bfs直接过。。。要特判k=0,否则%k会RE

#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<queue>#include<string>#include<map>#include<cstring>#include<vector>#define inf 1e9#define ll long long#define For(i,j,k) for(int i=j;i<=k;i++)#define Dow(i,j,k) for(int i=k;i>=j;i--)using namespace std;int n,m,k,l,r,mp[101][101][11],q[1001],tim[1001];bool vis[101][11];int main(){    scanf("%d%d",&n,&m);    For(i,1,m)    {        int x,y;        scanf("%d%d",&x,&y);        mp[x][y][0]=mp[y][x][0]=1;    }    scanf("%d",&k);    For(i,1,n)  mp[i][i][0]=1;    For(i,1,k)        For(j,1,n)  For(t,1,n)  mp[j][t][i]=mp[j][t][0];    if(k!=0)    For(i,0,k-1)    {        int x=1,y=1;        while(1)        {            scanf("%d%d",&x,&y);            if(x==0&&y==0)  break;            mp[x][y][i]=mp[y][x][i]=0;        }    }    q[1]=1;tim[1]=0;    vis[1][0]=1;    l=1;r=1;    while(l<=r)    {        int t=q[l];        if(t==n)        {            printf("%d",tim[l]);            return 0;        }        For(i,1,n)            if(k!=0)            {                if(mp[t][i][tim[l]%k]&&!vis[i][(tim[l]+1)%k])                    q[++r]=i,tim[r]=tim[l]+1,vis[i][(tim[l]+1)%k]=1;            }else            {                if(mp[t][i][0]&&!vis[i][0])                    q[++r]=i,tim[r]=tim[l]+1,vis[i][0]=1;            }        l++;    }    printf("No solution.\n");}
1 0
原创粉丝点击