P2296-寻找道路

P2296-寻找道路,第1张

概述1 #include <bits/stdc++.h> 2 #define _for(i,a,b) for(int i = (a);i < b;i ++) 3 #define _rep(i,a,b) for(int i = (a);i > b;i --) 4 #define INF 0x3f3f3f3f 5 #define MOD 1000000007 6 #defin
  1 #include <bits/stdc++.h>  2 #define _for(i,a,b) for(int i = (a);i < b;i ++)  3 #define _rep(i,b) for(int i = (a);i > b;i --)  4 #define INF 0x3f3f3f3f  5 #define MOD 1000000007  6 #define maxn 200003  7 typedef long long ll;  8   9 using namespace std; 10 typedef pair<int,int> P;//first 是最短距离,second 是顶点编号 11 inline ll read() 12 { 13     ll ans = 0; 14     char ch = getchar(),last =  ; 15     while(!isdigit(ch)) last = ch,ch = getchar(); 16     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - 0,ch = getchar(); 17     if(last == -) ans = -ans; 18     return ans; 19 } 20 inline voID write(ll x) 21 { 22     if(x < 0) x = -x,putchar(-); 23     if(x >= 10) write(x / 10); 24     putchar(x % 10 + 0); 25 } 26 int V,E; 27 int st,ed; 28 int ver[maxn],Next[maxn],head[maxn],val[maxn]; 29 int ver1[maxn],Next1[maxn],head1[maxn],val1[maxn]; 30 int novis[maxn]; 31 int cango[maxn]; 32 int vis[maxn]; 33 int tot = 0,tot1 = 0; 34 voID add(int x,int y,int w) 35 { 36     ver[++tot] = y,Next[tot] = head[x],head[x] = tot,val[tot] = w; 37 } 38 voID add1(int x,int w) 39 { 40     ver1[++tot1] = y,Next1[tot1] = head1[x],head1[x] = tot1,val1[tot1] = w; 41 } 42 int d[maxn]; 43 voID shortest_path(int s) 44 { 45     priority_queue<P,vector<P>,greater<P>> que; 46  47     _for(i,1,V+1) 48     d[i] = INF; 49     d[s] = 0; 50     que.push(P {0,s}); 51  52     while(!que.empty()) 53     { 54         P p = que.top(); 55         que.pop(); 56         int v = p.second; 57         if(novis[v] || d[v] < p.first) continue; 58         for(int i = head[v]; i; i = Next[i]) 59         { 60             int y = ver[i]; 61             int w = val[i]; 62             if(d[y] > d[v] + w) 63             { 64                 d[y] = d[v] + w; 65                 que.push(P {d[y],y}); 66             } 67         } 68     } 69 } 70  71 bool dfs(int s) 72 { 73     cango[s] = 1; 74     for(int i = head1[s]; i; i = Next1[i]) 75     { 76         int y = ver1[i]; 77         if(!vis[y]) 78         { 79             vis[y] = 1; 80             dfs(y); 81         } 82     } 83 } 84 bool dfs2(int s) 85 { 86     for(int i = head[s]; i; i = Next[i]) 87     { 88         int y = ver[i]; 89         if(!cango[y]) 90             novis[s] = 1; 91         if(!vis[y]) 92         { 93             vis[y] = 1; 94             dfs2(y); 95         } 96     } 97 } 98 int main() 99 {100 //    freopen("testdata.in","r+",stdin);101     V = read(),E = read();102     _for(i,E+1)103     {104         int a = read();105         int b = read();106         add(a,b,1);107         add1(b,1);108     }109     st = read();110     ed = read();111     dfs(ed);112     memset(vis,0,sizeof(vis));113     dfs2(st);114 /*115     printf("\n");116     _for(i,1,V+1)117     printf("%d %d %d\n",i,novis[i],cango[i]);118 */119     120     shortest_path(st);121     if(d[ed]==INF)122         printf("%d\n",-1);123     else124         printf("%d\n",d[ed]);125     return 0;126 }
总结

以上是内存溢出为你收集整理的P2296-寻找道路全部内容,希望文章能够帮你解决P2296-寻找道路所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1210224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存