题意:给出一张有向图,问最少改变多少条边的方向,使得图中存在一条从1到N的路径
思路:原本有的路径权值为0,新加一个反向的路径,权值为1,这样只要走一次新加的路径,最短路就会加1,最后的长度就是新加路径的个数了
#include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; #define MAX 20010 #define inf 0x3f3f3f3f int n,m; int first[MAX],d[MAX],inq[MAX],w[MAX],v[MAX],next[MAX],e; void init() { e =0 ; memset(first,-1,sizeof(first)); } void add_edge(int a,int b,int c) { v[e] = b; next[e] = first[a]; w[e] = c; first[a]= e++; } void spfa(int src) { queue<int>q; memset(d,0x3f,sizeof(d)); d[src]= 0,inq[src] = 1; q.push(src); while(!q.empty()) { int u = q.front(); q.pop(); inq[u] =0; for(int i =first[u];i!= -1;i = next[i]) { if(d[v[i]]>d[u]+w[i]) { d[v[i]] = d[u]+ w[i]; if(!inq[v[i]])q.push(v[i]),inq[v[i]] =1; } } } } int main() { while(cin>> n>> m) { init(); for(int i=0;i< m;i++) { int a,b; cin >> a>>b; add_edge(a,b,0); add_edge(b,a,1); } spfa(1); if(d[n]!= inf)cout<<d[n]<< endl; else cout<< "-1"<< endl; } return 0; }
csuoj 1256
时间: 2024-10-14 12:34:11