csuoj 1256

题意:给出一张有向图,问最少改变多少条边的方向,使得图中存在一条从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

csuoj 1256的相关文章

CSUOJ 1256 天朝的单行道

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1256 题目大意: 在另一个平行宇宙中,有一个神奇的国度名叫天朝.天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道. 不久前天朝大选,小Q当选了天朝的总统.小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从城市1搬迁到城市N去居住.然而小Q惊奇的发现,现在并不存在从城市1出发到城市N路线. 但这点难题是无

next_permutation,POJ(1256)

题目链接:http://poj.org/problem?id=1256 解题报告: 1.sort函数是按照ASC11码排序,而这里是按照 'A'<'a'<'B'<'b'<...<'Z'<'z'排序. #include <iostream> #include <algorithm> #include <string> using namespace std; bool cmp(char a,char b) { char m=tolowe

CSUOJ 1010 Water Drinking

Description The Happy Desert is full of sands. There is only a kind of animal called camel living on the Happy Desert. ‘Cause they live here, they need water here. Fortunately, they find a pond which is full of water in the east corner of the desert.

CSUOJ 1217 奇数个的那个数

Description 给定些数字,这些数中只有一个数出现了奇数次,找出这个数. Input 每组数据第一行n表示数字个数,1 <= n <= 2 ^ 18 且 n % 2 == 1. 接下来n行每行一个32位有符号整数. Output 出现奇数次那个数,每组数据对应一行. Sample Input 5 1 1 2 2 3 7 1 2 1 2 2 3 3 Sample Output 3 2 看了大神的代码 使用位运算o(╯□╰)o 1 # include <stdio.h> 2 i

HDU 1256 画8

画8 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4105    Accepted Submission(s): 1764 Problem Description 谁画8画的好,画的快,今后就发的快,学业发达,事业发达,祝大家发,发,发. Input 输入的第一行为一个整数N,表示后面有N组数据. 每组数据中有一个字符和一个整数,字

Aizu 2164 CSUOJ 1436 Revenge of the Round Table

dp套一个burnside的壳子核心还是dpdp[i]表示有i个循环节时的染色方案数注意在dp的时候,不需要考虑重构的问题因为burnside会解决重构的问题dpA[i][j]表示以A开头,长度为i,结尾为j个A的合法方案数dpB[i][j]表示以B开头,长度为i,结尾为j个A的合法方案数接下来我们用dpA,dpB来计算dp[i]显然对于所有的dpB[i][1~k]都是满足dp[i]的因为它表示以B开头,以A结尾的染色方案,且结尾没有超过k个另外还有一部分就是以A开头的了假设我们在整个串的最前面

csuoj 1511: 残缺的棋盘

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 1511: 残缺的棋盘 时间限制: 1 Sec  内存限制: 128 MB 题目描述 输入 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. 输出 对于每组数据,输出测试点编号和最少步数. 样例输入 1 1 8 7 5 6 1 1 3 3

CSU 1256 天朝的单行道

题目来源:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1256 一个完全单向的有向图,最少更改多少条边能够从1到N.把原有的边的权值设为0,换方向的边的权值设为1. 简历邻接表.add_edge(u,v,0);add_edge(v,u,0);采用SPFA算法求出1->N权值最小的情况,即为要更改多少 条边,注意最多的边数是2*10000而不是10000,因为这个居然TE,真是奇怪,到最后找了好久才找到这个错误. 1 #include<std

[2016-01-19][POJ][1256]

时间:2016-01-19  13:41:17  星期二 题目编号:POJ 1256 题目大意:给出一个word,求word组成字母的全排列,并输出 要求 输出顺序按字母顺序 字母顺序为 'A'<'a'<'B'<'b'<...<'Z'<'z' 方法: 通过上面的字母顺序构造一个cmp函数 先对原来的word进行重新排序 然后 用 next_permutation 进行生成后续排列,边生成边输出即可 解题过程遇到问题: next_permutation() 有第三个参数