CF 241E flights 最短路,重复迭代直到稳定 难度:3
2015-03-16 14:50
232 查看
http://codeforces.com/problemset/problem/241/E
首先检测哪些点会出现在从起点到终点的路上,可以用dfs或者迭代,
然后,对于所有的边,设f为边起点,t为边终点,dp[i]为从起点出发到i点所必须花费的时间,则当dp[t]>dp[f]+2,也就是超出限制时,把dp[t]限制到dp[f]+2处,对于dp[f]>dp[t]+1,限制dp[f]到dp[t]+1处
因为这个图没有圈,所以如果存在满足题意的边权方案,那么每次使得一个点的dp值满足要求,n次之后一定全部满足要求,不再发生改动,如果不存在满足题意的边权方案,就会不断发生震荡,此时及时停止循环输出No即可
注意不在起点到终点路上的边全都为1
首先检测哪些点会出现在从起点到终点的路上,可以用dfs或者迭代,
然后,对于所有的边,设f为边起点,t为边终点,dp[i]为从起点出发到i点所必须花费的时间,则当dp[t]>dp[f]+2,也就是超出限制时,把dp[t]限制到dp[f]+2处,对于dp[f]>dp[t]+1,限制dp[f]到dp[t]+1处
因为这个图没有圈,所以如果存在满足题意的边权方案,那么每次使得一个点的dp值满足要求,n次之后一定全部满足要求,不再发生改动,如果不存在满足题意的边权方案,就会不断发生震荡,此时及时停止循环输出No即可
注意不在起点到终点路上的边全都为1
#include <cstdio> #include <cstring> using namespace std; const int maxn=1e3+2; const int maxm=5e3+2; const int inf=0x3fffffff; int n,m; int vis[maxn]; int e[maxm][2]; int dp[maxn]; int main(){ scanf("%d%d",&n,&m); for(int i=0;i<m;i++)scanf("%d%d",e[i],e[i]+1); vis[1]=1;vis =2; bool fl=true; while(fl){ fl=false; for(int i=0;i<m;i++){ int f=e[i][0],t=e[i][1]; if((vis[f]&1)&&(vis[t]&1)==0){ vis[t]|=1;fl=true; } if((vis[t]&2)&&(vis[f]&2)==0){ vis[f]|=2;fl=true; } } } fl=true; int cnt=0; while(fl){ fl=false; cnt++; for(int i=0;i<m;i++){ int f=e[i][0],t=e[i][1]; if(vis[f]==3&&vis[t]==3){ if(dp[t]>dp[f]+2){ dp[t]=dp[f]+2; fl=true; } if(dp[f]>dp[t]-1){ dp[f]=dp[t]-1; fl=true; } } } if(cnt>n&&fl){puts("No");return 0;} } puts("Yes"); for(int i=0;i<m;i++){ int f=e[i][0],t=e[i][1]; if(vis[f]==3&&vis[t]==3)printf("%d\n",dp[t]-dp[f]); else puts("1"); } return 0; }
相关文章推荐
- [CF241E]Flights
- CF 241E Flights
- Oracle分页查询数据重复与不稳定解决方案
- 另类办法,实现点击按钮后禁用,直到操作完成后恢复,防止重复操作,实用
- cf 290F. Treeland Tour 最长上升子序列 + 树的回溯 难度:1
- POJ 1860 Currency Exchange 最短路 难度:0
- CF-30 D - King's Problem?(枚举+最短路)
- HDU最短路劲基础题 难度解析
- 求最短路即次短路模板,一条边可以重复走的HDU6181
- CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs
- zoj 2760 How Many Shortest Path 【最短路 + 最大流】 【求边不重复最短路径条数】
- [转]在计算机程序中,完成重复的任务有两种方式:递归和迭代(循环)。
- POJ 1062 昂贵的聘礼 最短路 难度:0
- CF-30 D - King's Problem?(枚举+最短路)
- 对正整数x、y连续进行求余,直到余数为0,此时非0的除数就是最大公约数。x除以y的余数是r,若r不等于0,则把y作为新的x,r作为新的y,重复x除以y的运算,直到r=0为止,此时y就为所求的最大公约数
- POJ 2253 Frogger 最短路 难度:0
- C语言猜数字游戏,范围为1到100,直到猜对为止,能重复进行多次
- CF 148D Bag of mice 概率dp 难度:0
- CF 173B Chamber of Secrets 最短路
- POJ 1125 Stockbroker Grapevine 最短路 难度:0