codeforces 601A(脑筋急转弯 , 55)
2015-11-26 10:59
127 查看
题目意思,给了最多400个点的完全图,但是每条边可能是公路也可能是铁路,求1个火车和一个汽车同时都从1出发到n中间不走到重复点的最短时间.
1 - n 这条边必定是铁路或公路,然后就没有然后了。
下面是自己傻X用压缩了一下转移写的。直接辆车出发最短时间到n 的最小值即答案、
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define clr(a , x) memset(a , x , sizeof(a))
#define rep(i , n) for(int i=0;i<(int)n ; i++)
#define rep1(j , x , y) for(int j=(int)x;j<=(int)y;j++)
#define repd(j , y , x) for(int j=(int)y;j>=(int)x;j--)
const int inf = 1e7;
const int N = 410;
int vis
;
vector<int> G[2]
;
int dis[2]
,d
[2];
struct node{
int x , y, dir;
node(){}
node(int x , int y,int dir):x(x) , y(y),dir(dir){}
};
int n, m;
int bfs() {
rep(i , 2){
queue<int> Q;
clr(dis[i], -1);
dis[i]
= 0;
Q.push(n);
while(!Q.empty()){
int u = Q.front() ; Q.pop();
for(auto v : G[i][u]){
if(dis[i][v] == -1){
dis[i][v] = dis[i][u] + 1;
Q.push(v);
}
}
}
}
int ans = inf;
clr(d , -1);
queue<node> Q;
d[1][1][0] = 0;
Q.push(node(1 , 1 , 0));
while(!Q.empty()){
node u = Q.front(); Q.pop();
int x = u.x , y = u.y , dir = u.dir;
if(u.x == n || u.y == n){
ans = min(ans , d[x][y][dir]/2 + (x==n ? (dis[1][y] == -1 ? inf : dis[1][y]) : (dis[0][x] == -1 ? inf : dis[0][x])));
continue;
}
if(dir == 0){
for(auto i : G[dir][x]){
if(d[i][y][1] == -1)
d[i][y][1] = d[x][y][dir] + 1 , Q.push(node(i , y , 1));
}
} else {
for(auto i : G[dir][y]) if(i != x && i!=y){
if(d[x][i][0] == -1)
d[x][i][0] = d[x][y][dir] + 1 , Q.push(node(x , i , 0));
}
}
}
return ans==inf ? -1 : ans;
}
int main()
{
while(scanf("%d %d",&n,&m)==2){
rep1(i , 1 , m){
int u , v;
scanf("%d %d",&u ,&v);
vis[u][v] = vis[v][u] = 1;
G[0][u].push_back(v);
G[0][v].push_back(u);
}
rep1(i ,1 , n) rep1(j, 1 , n)
if(i != j && !vis[i][j]) G[1][i].push_back(j);
cout<<bfs()<<endl;
}
return 0;
}
1 - n 这条边必定是铁路或公路,然后就没有然后了。
下面是自己傻X用压缩了一下转移写的。直接辆车出发最短时间到n 的最小值即答案、
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define clr(a , x) memset(a , x , sizeof(a))
#define rep(i , n) for(int i=0;i<(int)n ; i++)
#define rep1(j , x , y) for(int j=(int)x;j<=(int)y;j++)
#define repd(j , y , x) for(int j=(int)y;j>=(int)x;j--)
const int inf = 1e7;
const int N = 410;
int vis
;
vector<int> G[2]
;
int dis[2]
,d
[2];
struct node{
int x , y, dir;
node(){}
node(int x , int y,int dir):x(x) , y(y),dir(dir){}
};
int n, m;
int bfs() {
rep(i , 2){
queue<int> Q;
clr(dis[i], -1);
dis[i]
= 0;
Q.push(n);
while(!Q.empty()){
int u = Q.front() ; Q.pop();
for(auto v : G[i][u]){
if(dis[i][v] == -1){
dis[i][v] = dis[i][u] + 1;
Q.push(v);
}
}
}
}
int ans = inf;
clr(d , -1);
queue<node> Q;
d[1][1][0] = 0;
Q.push(node(1 , 1 , 0));
while(!Q.empty()){
node u = Q.front(); Q.pop();
int x = u.x , y = u.y , dir = u.dir;
if(u.x == n || u.y == n){
ans = min(ans , d[x][y][dir]/2 + (x==n ? (dis[1][y] == -1 ? inf : dis[1][y]) : (dis[0][x] == -1 ? inf : dis[0][x])));
continue;
}
if(dir == 0){
for(auto i : G[dir][x]){
if(d[i][y][1] == -1)
d[i][y][1] = d[x][y][dir] + 1 , Q.push(node(i , y , 1));
}
} else {
for(auto i : G[dir][y]) if(i != x && i!=y){
if(d[x][i][0] == -1)
d[x][i][0] = d[x][y][dir] + 1 , Q.push(node(x , i , 0));
}
}
}
return ans==inf ? -1 : ans;
}
int main()
{
while(scanf("%d %d",&n,&m)==2){
rep1(i , 1 , m){
int u , v;
scanf("%d %d",&u ,&v);
vis[u][v] = vis[v][u] = 1;
G[0][u].push_back(v);
G[0][v].push_back(u);
}
rep1(i ,1 , n) rep1(j, 1 , n)
if(i != j && !vis[i][j]) G[1][i].push_back(j);
cout<<bfs()<<endl;
}
return 0;
}
相关文章推荐
- 获取。。。。先占位
- 数组初始化
- autorelease pool
- nginx初测
- 监理工程师岁月--农民工的工作与生活
- js原生函数bind
- Android启动时间优化查看及冷启动时间优化优化
- 对工资在1000到2000元之间的员工更感兴趣,要求工资在这个范围员工排序在前面
- codeforce #322C Developing Skills (优先队列)
- Java static关键字
- (转)hadoop基本操作命令
- 安卓运行环境
- Xmind & MindManager
- 文章标题
- maven 下载 源码和javadoc命令
- SQL Server2008定期清理日志
- 59 Which background process of a database instance, using Automatic Storage Management (ASM), connec
- OpenCV的随机数发生器
- oracle存储过程常用技巧
- 23、手把手教你Extjs5(二十三)模块Form的自定义的设计[2]